#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e2 + 14, maxm = 1e6 + 14, mod = 998244353;
int n, m, mn[maxn], mx[maxn], a[maxm];
int dp[2 * maxn][2 * maxn];
vector<int> occ[maxn];
bool brk(int al, int ar, int bl, int br) {
  if (al > bl) swap(al, bl), swap(ar, br);
  return al < bl && bl < ar && ar < br;
}
int rem[maxm], add[maxm];
int solve(int l = 0, int r = m) {
  if (l + 1 >= r) return 1;
  if (dp[l][r] != -1) return dp[l][r];
  stack<int> st;
  for (int i = l; i < r; i++) {
    if (st.size() && st.top() > a[i]) return dp[l][r] = 0;
    if (add[i] != -1) st.push(a[i]);
    if (rem[i] != -1) {
      if (st.empty() || st.top() != rem[i]) return dp[l][r] = 0;
      st.pop();
    }
  }
  if (st.size()) return dp[l][r] = 0;
  int mid = n;
  for (int i = n - 1; i >= 0; i--) {
    if (l <= mn[i] && mx[i] < r) mid = i;
    if (brk(l, r, mn[i], mx[i] + 1)) return dp[l][r] = 0;
  }
  if (mid == n) return 0;
  int L = 0, R = 0, in = 1;
  for (int i = 1; i < occ[mid].size(); i++)
    in = (long long)in * solve(occ[mid][i - 1] + 1, occ[mid][i]) % mod;
  for (int i = 0; i < n; i++)
    if (mn[i] <= mn[mid] && l <= mn[i])
      L = (L + (long long)solve(l, mn[i]) * solve(mn[i], mn[mid])) % mod;
  for (int i = 0; i < n; i++)
    if (mx[mid] <= mx[i] && mx[i] < r)
      R = (R + (long long)solve(mx[mid] + 1, mx[i] + 1) * solve(mx[i] + 1, r)) %
          mod;
  return dp[l][r] = (long long)L * in % mod * R % mod;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  memset(mn, 63, sizeof mn);
  memset(dp, -1, sizeof dp);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> a[i];
    a[i]--;
  }
  m = unique(a, a + m) - a;
  if (m > 2 * n) return cout << "0\n", 0;
  for (int i = 0; i < m; i++) {
    int x = a[i];
    mn[x] = min(mn[x], i);
    mx[x] = i;
    occ[x].push_back(i);
  }
  memset(rem, -1, sizeof rem);
  memset(add, -1, sizeof rem);
  for (int i = 0; i < n; i++) {
    rem[mx[i]] = i;
    add[mn[i]] = i;
  }
  cout << solve() << '\n';
}
