1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include <bits/stdc++.h> using namespace std; using ll = long long;
constexpr int inf = 0x3f3f3f3f; constexpr int mo = 998244353;
struct PresidentTree{ int n, tot; vector<int> root, lp, rp, cnt; vector<int> ori; vector<ll> sum; vector<ll> prod;
void init(int n_, auto vec){ tot = 0; n = n_; root = vector<int>(n + 1); lp = rp = cnt = vector<int>(4*n + 17*n); sum = vector<ll>(4*n + 17*n); prod = vector<ll>(4*n + 17*n, 1); ori = vec; } void insert(int fa, int &u, int l, int r, int x){ u = ++tot; lp[u] = lp[fa], rp[u] = rp[fa]; cnt[u] = cnt[fa] + 1; sum[u] = sum[fa] + ori[x]-1; prod[u] = prod[fa] * ori[x] % mo;
if(l == r) return;
int mid = l + r >> 1; if(x <= mid) insert(lp[fa], lp[u], l, mid, x); else insert(rp[fa], rp[u], mid + 1, r, x); } void work(int u, int v, int l, int r, ll k, auto& num, auto& den){ if(l == r){ if(cnt[u] < cnt[v]){ num *= max(1ll, ori[l] - k); num %= mo; } return; }
int mid = l + r >> 1; ll x = sum[lp[v]] - sum[lp[u]]; if(x <= k){ work(rp[u], rp[v], mid+1, r, k-x, num, den); } else{ num *= prod[rp[v]], num %= mo; den *= prod[rp[u]], den %= mo; work(lp[u], lp[v], l, mid, k, num, den); } } };
ll qpow(ll a, ll x){ ll ans = 1; while(x){ if(x & 1) ans *= a; a *= a; x >>= 1;
a %= mo; ans %= mo; } return ans; } ll inv(int x){ return qpow(x, mo - 2); }
void solve(){ int n, q; cin >> n >> q; vector<int> a(n + 1); for(int i=1; i<=n; i++){ cin >> a[i]; }
vector<int> ori(n + 1); vector<int> p(n + 1); iota(p.begin()+1, p.end(), 1); sort(p.begin()+1, p.end(), [&](int x, int y){ return a[x] < a[y]; }); for(int i=1; i<=n; i++){ ori[i] = a[p[i]]; a[p[i]] = i; } PresidentTree pt; pt.init(n, ori); for(int i=1; i<=n; i++){ pt.insert(pt.root[i-1], pt.root[i], 1, n, a[i]); } for(int i=1; i<=q; i++){ ll num = 1, den = 1; int l, r; ll k; cin >> l >> r >> k; pt.work(pt.root[l-1], pt.root[r], 1, n, k, num, den); cout << num * inv(den) % mo << '\n'; }
}
int main(){ ios::sync_with_stdio(false); cin.tie(nullptr);
int t = 1; while(t--) solve(); return 0; }
|