#include using namespace std; const int MAXN = 2e5 + 5, mod = 998244353; int n, OP, a[MAXN], id[MAXN], pre[MAXN], suf[MAXN], fac[MAXN], siz[MAXN], in[MAXN]; map, int> mp; vector e[MAXN]; int qpow(int a, int b){ int res = 1; for(; b; b >>= 1, a = 1ll * a * a % mod) if(b & 1) res = 1ll * res * a % mod; return res; } void dfs(int u){ siz[u] = 1; for(int v : e[u]) dfs(v), siz[u] += siz[v]; } void solve(){ cin >> n; for(int i = 1; i <= n; ++i) cin >> a[i], id[i] = i, suf[i] = i + 1, pre[i] = i - 1; sort(id + 1, id + n + 1, [](int p, int q){ return a[p] < a[q]; }); mp.clear(); set> st, st1; for(int i = 1; i <= n; ++i) st1.insert({a[i], i}); for(int i = 1; i <= n; ++i){ int u = st1.begin()->second, x = pre[u], y = suf[u]; st1.erase(st1.begin()); if(a[u]) return cout << "0\n", void(); if(x) st.insert({x, u}), st1.erase({a[x], x}), st1.insert({--a[x], x}); if(y <= n) st.insert({y, u}), st1.erase({a[y], y}), st1.insert({--a[y], y}); if(mp[{u, x}]) st.erase({x, mp[{u, x}]}); if(mp[{u, y}]) st.erase({y, mp[{u, y}]}); mp[{x, y}] = mp[{y, x}] = u; suf[pre[u]] = suf[u], pre[suf[u]] = pre[u]; } for(int i = 1; i <= n; ++i) vector().swap(e[i]), in[i] = 0; for(auto [x, y] : st) if(x && y) e[x].push_back(y), in[y]++; if(count(in + 1, in + n + 1, 0) != 1) return cout << "0\n", void(); int rt = min_element(in + 1, in + n + 1) - in; dfs(rt); fac[0] = 1; for(int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % mod; int ans = fac[n]; for(int i = 1; i <= n; ++i) ans = 1ll * ans * qpow(siz[i], mod - 2) % mod; cout << (OP ? ans : 1) << '\n'; } signed main(){ ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int T; T=1,OP=1; while(T--) solve(); return 0; }