#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
template <class T>
inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T>
inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
int N;
int M;
int C[501];
int rev[501];
long long dp[2][502][502];
long long imos[502];
void Add(long long &d, long long v) {
  d += v;
  while (d >= MOD) d -= MOD;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  cin >> N >> M;
  for (int(i) = 0; (i) < (N); ++(i)) {
    cin >> C[i];
    C[i]--;
    rev[C[i]] = i;
  }
  int src = 0;
  int dst = 1;
  for (int(i) = 0; (i) < (N); ++(i)) {
    dp[src][i][i + 1] = 1;
    dp[src][i][i] = 1;
  }
  dp[src][N][N] = 1;
  vector<long long> L(N);
  vector<long long> R(N + 1);
  for (int(i) = (N)-1; (i) >= 0; --(i)) {
    for (int(l) = 0; (l) < (N); ++(l)) {
      L[l] = 0;
      for (int(p) = l; (p) < (rev[i] + 1); ++(p)) {
        Add(L[l], dp[src][l][p] * dp[src][p][rev[i]] % MOD);
      }
    }
    for (int(r) = 1; (r) < (N + 1); ++(r)) {
      R[r] = 0;
      for (int(q) = rev[i] + 1; (q) < (r + 1); ++(q)) {
        Add(R[r], dp[src][rev[i] + 1][q] * dp[src][q][r] % MOD);
      }
    }
    for (int(l) = 0; (l) < (N); ++(l)) {
      for (int(r) = l + 1; (r) < (N + 1); ++(r)) {
        if (rev[i] < l || r <= rev[i]) {
          dp[dst][l][r] = dp[src][l][r];
        } else {
          Add(dp[dst][l][r], L[l] * R[r] % MOD);
        }
      }
    }
    swap(src, dst);
    fill(dp[dst][0], dp[dst + 1][0], 0);
    for (int(j) = 0; (j) < (N + 1); ++(j)) {
      dp[src][j][j] = 1;
    }
  }
  cout << dp[src][0][N] << endl;
}
