一直卡在 #14 为了加速线段树都用上了。。。
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=1310;
int n,m,cnt,a[N],pl[N],pr[N];
long long dp[N][N];
int g[N][N],pos[N][N];
#define lson o<<1
#define rson o<<1|1
struct node{int l,r,mi,pos;}t[N<<1];
void build(int o,int l,int r){
t[o].l=l,t[o].r=r;if(l==r){t[o].mi=a[l];return;}
int mid=(l+r)>>1;
build(lson,l,mid),build(rson,mid+1,r);
t[o].mi=min(t[lson].mi,t[rson].mi);
}
int query(int o,int l,int r){
if(t[o].l==l and t[o].r==r) return t[o].mi;
int mid=(t[o].l+t[o].r)>>1;
if(r<=mid) return query(lson,l,r);
else if(l>mid) return query(rson,l,r);
else return min(query(lson,l,mid),query(rson,mid+1,r));
}
void deal(){
n=cnt;for(int i=1;i<=n;i++) g[a[i]][++g[a[i]][0]]=i;
build(1,1,n);for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) pos[i][j]=query(1,i,j);
}
long long dfs(int l,int r){
if(l>=r) return 1;
if(dp[l][r]) return dp[l][r];
int p=pos[l][r];
int lpos=g[p][1],rpos=g[p][g[p][0]];
long long suml=0,sumr=0,ans=0;
for(int i=l;i<=lpos;i++) suml=(suml+dfs(l,i-1)*dfs(i,lpos-1))%mod;
for(int i=rpos;i<=r;i++) sumr=(sumr+dfs(rpos+1,i)*dfs(i+1,r))%mod;
ans=suml*sumr%mod;
for(int i=1;i<=g[p][0]-1;i++) ans=ans*dfs(g[p][i]+1,g[p][i+1]-1)%mod;
return dp[l][r]=ans;
}
signed main(){
cin>>n>>m;int po=0;
for(int i=1,x;i<=m;i++){
scanf("%d",&x);
if(x!=po) a[++cnt]=x,po=x;
}
if(cnt>2*n) return puts("0"),0;
deal(),dfs(1,n);
cout<<dp[1][n];
}