inline LL get_phi(LL n) { LL ans = n; for (LL i = 2; i * i <= n; ++i) if (!(n % i)) { while (!(n % i)) n /= i; ans = ans / i * (i - 1); } if (n > 1) ans = ans / n * (n - 1); return ans; }
inlinevoidupdate(int o, int l, int r, int x, int y, LL val) { if (x > y) return ; if (x <= l && r <= y) { node[o].val += val, node[o].tag += val; return ; } push_down (o); if (x <= mid) update (lson, x, y, val); if (y > mid) update (rson, x, y, val); push_up (o); }
inlinevoidSolve() { LL sum = 0; for (int i = 1; i <= N; ++i) { sum += A[i]; SEG :: update (1, 1, N - 1, i, i, sum); }
LL ans = LLONG_MAX; for (int i = 1; i <= N; ++i) { int p = Pos[i]; if (p == 1 || p == N) Chkmin(ans, (LL) A[p]); SEG :: update (1, 1, N - 1, 1, p - 1, A[p]); SEG :: update (1, 1, N - 1, p, N - 1, -A[p]); Chkmin (ans, SEG :: query ()); }
cout << ans << endl; }
inlinevoidInput() { N = read<int>(); for (int i = 1; i <= N; ++i) Pos[P[i] = read<int>()] = i; for (int i = 1; i <= N; ++i) A[i] = read<int>(); }
namespace MATH { int fac[MAXN + 5], ifac[MAXN + 5], inv[MAXN + 5];
inlinevoidADD(int &a, int b){ if ((a += b) >= MOD) a -= MOD; }
inlineintPow(int a, int b) { int ans = 1; for (int i = b; i; i >>= 1, a = (LL) a * a % MOD) if (i & 1) ans = (LL) ans * a % MOD; return ans; }
inlinevoidinit(int n = MAXN + 1) { fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = (LL) fac[i - 1] * i % MOD; ifac[n] = Pow (fac[n], MOD - 2); for (int i = n - 1; i >= 0; --i) ifac[i] = (LL) ifac[i + 1] * (i + 1) % MOD; for (int i = 0; i < n; ++i) inv[i + 1] = (LL) fac[i] * ifac[i + 1] % MOD; }
inlineintC(int n, int m) { if (n < m || n < 0 || m < 0) return0; if (m == 0) return1; if (m == 1) return n; return (LL) C (n, m - 1) * (n - m + 1) % MOD * inv[m] % MOD; } }
usingnamespace MATH;
int N; int L[MAXN + 5], R[MAXN + 5]; int Hash[MAXM + 5], M;
inlinevoidInit() { sort (Hash + 1, Hash + M + 1); M = unique (Hash + 1, Hash + M + 1) - Hash - 1; for (int i = 1; i <= N; ++i) { L[i] = lower_bound (Hash + 1, Hash + M + 1, L[i]) - Hash; R[i] = lower_bound (Hash + 1, Hash + M + 1, R[i]) - Hash; } }
int f[MAXM + 5][MAXN + 5];
inlineintcheck(int x, int k) { if (x == 0) return1; if (Hash[L[x]] <= Hash[k - 1] + 1 && Hash[k] <= Hash[R[x]]) return1; return0; }
int sum = 1;
inlinevoidSolve() { Init (); f[M + 1][0] = 1;
for (int i = M + 1; i >= 2; --i) for (int j = 0; j <= N; ++j) if (f[i][j]) { int len = Hash[i - 1] - Hash[i - 2]; ADD (f[i - 1][j], f[i][j]); for (int k = 1; j + k <= N && check (j + k, i - 1); ++k) ADD (f[i - 1][j + k], (LL) f[i][j] * C (len + k - 1, k) % MOD); }
cout << (LL) f[1][N] * Pow (sum, MOD - 2) % MOD << endl; }
inlinevoidInput() { N = read<int>(); for (int i = 1; i <= N; ++i) { L[i] = read<int>(), R[i] = read<int>(); Hash[++M] = L[i], Hash[++M] = L[i] - 1, Hash[++M] = R[i]; sum = (LL) sum * (R[i] - L[i] + 1) % MOD; } }