#define M 200005 #include #include using namespace std; using mint=atcoder::modint998244353; int n,a[M],l[M],r[M],o[M],t[M][2],f[M],s[M]; vectorc[M]; mint F[M],iF[M]; void d(int x){l[r[x]]=l[x];r[l[x]]=r[x];} mint C(int n,int k){return n>=k&&k>=0?F[n]*iF[k]*iF[n-k]:0;} void D(int u){s[u]=1;for(int v:c[u])D(v),s[u]+=s[v];} int main(){ scanf("%d",&n); F[0]=1;for(int i=1;i<=n;i++)F[i]=F[i-1]*i; iF[n]=F[n].inv();for(int i=n;i;i--)iF[i-1]=iF[i]*i; for(int i=1;i<=n;i++)scanf("%d",a+i),l[i]=i-1,r[i]=i+1,t[i][0]=t[i][1]=-1; queueq; for(int i=1;i<=n;i++)if(!a[i])q.push(i); int T=0,O=1; while(!q.empty()){ int x=q.front();q.pop();o[x]=++T; if(l[x]>=1){if(!a[l[x]]){O=0;break;}t[x][0]=l[x];a[l[x]]--;if(!a[l[x]])q.push(l[x]);} if(r[x]<=n){if(!a[r[x]]){O=0;break;}t[x][1]=r[x];a[r[x]]--;if(!a[r[x]])q.push(r[x]);} d(x); if(!O||T==n-1)break; } if(T!=n-1||!O){puts("0");return 0;} int R=0;for(int i=1;i<=n;i++)if(!o[i])R=i; o[R]=n; for(int i=1;i<=n;i++)if(t[i][0]>=0||t[i][1]>=0)f[i]=t[i][0]<0?t[i][1]:t[i][1]<0?t[i][0]:(o[t[i][0]]=0&&t[i][1]>=0)A*=C(s[t[i][0]]+s[t[i][1]],s[t[i][0]]); if(c[R].size()>=2){ int S=0;for(int v:c[R])S+=s[v]; A*=F[S];for(int v:c[R])A*=iF[s[v]]; } printf("%d\n",A.val()); }