Problem: This is the first subtask of problem F. The only differences between this and the second subtask are the constraints on the value of m and the time limit. You need to solve both subtasks in order to hack this one.

There are n+1 distinct colours in the universe, numbered 0 through n. There is a strip of paper m centimetres long initially painted with colour 0. 

Alice took a brush and painted the strip using the following process. For each i from 1 to n, in this order, she picks two integers 0 ≤ a_i < b_i ≤ m, such that the segment [a_i, b_i] is currently painted with a single colour, and repaints it with colour i. 

Alice chose the segments in such a way that each centimetre is now painted in some colour other than 0. Formally, the segment [i-1, i] is painted with colour c_i (c_i ≠ 0). Every colour other than 0 is visible on the strip.

Count the number of different pairs of sequences \\{a_i\}_{i=1}^n, \\{b_i\}_{i=1}^n that result in this configuration. 

Since this number may be large, output it modulo 998244353.

Input

The first line contains a two integers n, m (1 ≤ n ≤ 500, n = m) — the number of colours excluding the colour 0 and the length of the paper, respectively.

The second line contains m space separated integers c_1, c_2, …, c_m (1 ≤ c_i ≤ n) — the colour visible on the segment [i-1, i] after the process ends. It is guaranteed that for all j between 1 and n there is an index k such that c_k = j.

Note that since in this subtask n = m, this means that c is a permutation of integers 1 through n.

Output

Output a single integer — the number of ways Alice can perform the painting, modulo 998244353.

Examples

Input


3 3
1 2 3


Output


5


Input


7 7
4 5 1 6 2 3 7


Output


165

Note

In the first example, there are 5 ways, all depicted in the figure below. Here, 0 is white, 1 is red, 2 is green and 3 is blue.

<image>

Below is an example of a painting process that is not valid, as in the second step the segment 1 3 is not single colour, and thus may not be repainted with colour 2.

<image>

Solution (in JAVA):

Solution:
/*
If you want to aim high, aim high
Don't let that studying and grades consume you
Just live life young
******************************
What do you think? What do you think?
1st on Billboard, what do you think of it
Next is a Grammy, what do you think of it
However you think, I’m sorry, but shit, I have no fcking interest
*******************************
I'm standing on top of my Monopoly board
That means I'm on top of my game and it don't stop
til my hip don't hop anymore
https://www.a2oj.com/Ladder16.html
*******************************
300iq as writer = Sad!
*/
import java.util.*;
import java.io.*;
import java.math.*;

   public class x1178F1
   {
      static long MOD = 998244353L;
      public static void main(String hi[]) throws Exception
      {
         BufferedReader infile = new BufferedReader(new InputStreamReader(System.in));
         StringTokenizer st = new StringTokenizer(infile.readLine());
         int N = Integer.parseInt(st.nextToken());
         int M = Integer.parseInt(st.nextToken());
         int[] arr = new int[N];
         st = new StringTokenizer(infile.readLine());
         for(int i=0; i < N; i++)
            arr[i] = Integer.parseInt(st.nextToken());
         loc = new int[N+1];
         for(int i=0; i < N; i++)
            loc[arr[i]] = i;
         rmq = new int[N][N];
         for(int a=0; a < N; a++)
         {
            int min = Integer.MAX_VALUE;
            for(int b=a; b < N; b++)
            {
               min = Math.min(min, arr[b]);
               rmq[a][b] = min;
            }
         }
         dp = new long[N][N];
         for(int i=0; i < N; i++)
            Arrays.fill(dp[i], -1);
         System.out.println(dfs(0, N-1));
      }
      static long[][] dp;
      static int[] loc;
      static int[][] rmq;
      public static long dfs(int L, int R)
      {
         if(dp[L][R] != -1)
            return dp[L][R];
         long res1 = 1L;
         int pivot = loc[rmq[L][R]];
         if(L != pivot)
         {
            res1--;
            for(int a=L+1; a < pivot; a++)
            {
               res1 += (dfs(L, a-1)*dfs(a, pivot-1))%MOD;
               if(res1 >= MOD)   res1 -= MOD;
            }
            res1 += (2*dfs(L, pivot-1))%MOD;
            if(res1 >= MOD)   res1 -= MOD;
         }
         long res2 = 1L;
         if(R != pivot)
         {
            res2--;
            for(int b=pivot+1; b < R; b++)
            {
               res2 += (dfs(pivot+1, b)*dfs(b+1, R))%MOD;
               if(res2 >= MOD)   res2 -= MOD;
            }
            res2 += (2*dfs(pivot+1, R))%MOD;
            if(res2 >= MOD)   res2 -= MOD;
         }
         return dp[L][R] = (res1*res2)%MOD;
      }
   }