template <classT> inlinevoidchmin(T &x, const T &y){ if (x > y) { x = y; } } template <classT> inlinevoidchmax(T &x, const T &y){ if (x < y) { x = y; } }
constint mod = 1e9 + 7;
template <classT> inlineintqpow(int a, T b, int p){ int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = 1ll * ans * a % p; a = 1ll * a * a % p; } return ans; }
structBinomCoef { std::vector<int> fact, facv;
BinomCoef() {} BinomCoef(int n) { init(n); }
voidinit(int n){ fact.resize(n + 1), facv.resize(n + 1); fact[0] = 1; for (int i = 1; i <= n; i ++) { fact[i] = 1ll * fact[i - 1] * i % mod; } facv[n] = qpow(fact[n], mod - 2, mod); for (int i = n - 1; i >= 0; i --) { facv[i] = 1ll * facv[i + 1] * (i + 1) % mod; } }
intbinom(int n, int m){ if (n < m || m < 0) { return0; } return1ll * facv[m] * facv[n - m] % mod * fact[n] % mod; } } bc(500000);
constint N = 500100;
int n; i64 a[N];
intsolve(int l, int r){ if (l > r) { return1; } auto check = [&] (int i) { return a[i] == 1ll * (i - l + 1) * (r - i + 1); };
int i = l, j = r; while (i <= j) { if (i <= j) { if (check(i)) { return1ll * solve(l, i - 1) * solve(i + 1, r) % mod * bc.binom(r - l, i - l) % mod; } i ++; } if (i <= j) { if (check(j)) { return1ll * solve(l, j - 1) * solve(j + 1, r) % mod * bc.binom(r - l, j - l) % mod; } j --; } } return0; }
voidwork(){ std::cin >> n;
for (int i = 1; i <= n; i ++) { std::cin >> a[i]; }