#include #include using namespace std; using isize = size_t; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; using f64 = long double; using p2 = pair; using el = tuple; using mint = atcoder::modint998244353; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } p2 op(p2 a, p2 b) {return min(a, b);} p2 e() {return {1e18, 1e18};} vector g[200000]; vector fac(300000, 1), finv(300000, 1), inv(300000, 0); pair dfs(i64 v) { i64 siz = 0; mint res = 1; for (i64 nv : g[v]) { auto [ns, p] = dfs(nv); res *= fac[siz + ns] * finv[siz] * finv[ns] * p; siz += ns; } siz++; return {siz, res}; } void _main() { inv[1] = 1; i64 mod = 998244353; for (i64 i = 2; i < fac.size(); i++) { fac[i] = fac[i - 1] * i; inv[i] = -inv[mod % i] * (mod / i); finv[i] = finv[i - 1] * inv[i]; } i64 n; cin >> n; vector a(n); for (i64 i = 0; i < n; i++) { cin >> a[i]; } atcoder::segtree seg(n); for (i64 i = 0; i < n; i++) { seg.set(i, {a[i], i}); } vector> pars(n); vector ord(n, -1); i64 cnt = 0; while (seg.all_prod().first == 0) { auto [_, i] = seg.all_prod(); ord[i] = cnt++; seg.set(i, e()); i64 l = seg.min_left(i, [&](p2 t){return t == e();}) - 1; i64 r = seg.max_right(i, [&](p2 t){return t == e();}); if (l >= 0) { auto [x, li] = seg.get(l); seg.set(l, {x - 1, li}); pars[i].push_back(l); } if (r < n) { auto [x, ri] = seg.get(r); seg.set(r, {x - 1, ri}); pars[i].push_back(r); } } if (seg.all_prod() != e()) { cout << "0\n"; return; } vector par(n, -1); for (i64 i = 0; i < n; i++) { if (pars[i].empty()) continue; if (pars[i].size() == 1) { par[i] = pars[i][0]; continue; } i64 x = pars[i][0], y = pars[i][1]; if (ord[x] < ord[y]) par[i] = x; else par[i] = y; } i64 root = -1; for (i64 i = 0; i < n; i++) { if (par[i] != -1) { g[par[i]].push_back(i); } else root = i; } auto [siz, res] = dfs(root); assert(siz == n); cout << res.val() << "\n"; }