#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]=l[i]>=1?l[i]:-1; t[i][1]=r[i]<=n?r[i]:-1; } queueq; for(int i=1;i<=n;i++)if(!a[i])q.push(i),d(i); int T=0,O=1; while(!q.empty()){ int x=q.front();q.pop(); if(T>=n-1){O=0;break;} o[x]=++T; t[x][0]=l[x]>=1?l[x]:-1; t[x][1]=r[x]<=n?r[x]:-1; if(l[x]>=1){if(!a[l[x]]){O=0;break;}a[l[x]]--;if(!a[l[x]]){if(T=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]]); long long v=A.val(); v=(v%998244353LL+998244353LL)%998244353LL; printf("%d\n",(int)v); }