#include using namespace std; const int M=2e5+5,P=998244353; int n,a[M],l[M],r[M],ord[M],to[M][2],fa[M],sz[M]; vectorch[M]; long long F[M],iF[M]; void del(int x){l[r[x]]=l[x];r[l[x]]=r[x];} long long C(int n,int k){return n>=k&&k>=0?F[n]*iF[k]%P*iF[n-k]%P:0;} void dfs(int u){ sz[u]=1; for(int v:ch[u])dfs(v),sz[u]+=sz[v]; } int main(){ scanf("%d",&n); F[0]=1;for(int i=1;i<=n;i++)F[i]=F[i-1]*i%P; iF[n]=1;for(long long x=F[n],e=P-2;e;e/=2,x=x*x%P)if(e&1)iF[n]=iF[n]*x%P; for(int i=n;i;i--)iF[i-1]=iF[i]*i%P; for(int i=1;i<=n;i++){ scanf("%d",a+i); l[i]=i-1;r[i]=i+1; to[i][0]=to[i][1]=-1; } queueq; for(int i=1;i<=n;i++)if(a[i]==0)q.push(i),del(i); int tot=0,ok=1; while(!q.empty()){ int x=q.front();q.pop(); ord[x]=++tot; if(l[x]>=1){ if(a[l[x]]==0){ok=0;break;} to[x][0]=l[x];a[l[x]]--; if(a[l[x]]==0){if(tot