Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int mod = 1e9 + 7, N = 5e5 + 100;
- struct Data {
- int res, suff_sum, pref_sum, all_mul;
- }Tr[4*N];
- int a[N];
- Data Merge(Data a, Data b) {
- Data ret;
- ret.res = a.res + b.res;
- if(ret.res >= mod) ret.res -= mod;
- int t = 1ll*a.suff_sum*b.pref_sum%mod;
- ret.res += t;
- if(ret.res >= mod) ret.res -= mod;
- ret.pref_sum = a.pref_sum + (1ll*a.all_mul*b.pref_sum%mod);
- if(ret.pref_sum >= mod) ret.pref_sum -= mod;
- ret.suff_sum = b.suff_sum + (1ll*b.all_mul*a.suff_sum%mod);
- if(ret.suff_sum >= mod) ret.suff_sum -= mod;
- ret.all_mul = 1ll*a.all_mul*b.all_mul%mod;
- return ret;
- }
- void build(int cn, int b, int e) {
- if(b == e) {
- Tr[cn].res = Tr[cn].pref_sum = Tr[cn].suff_sum = Tr[cn].all_mul = a[b];
- return;
- }
- int lc = 2*cn, rc = lc + 1;
- int mid = (b+e)/2;
- build(lc, b, mid);
- build(rc, mid+1, e);
- Tr[cn] = Merge(Tr[lc], Tr[rc]);
- }
- void upd(int cn, int b, int e, int i, int x) {
- if(b == e) {
- Tr[cn].res = Tr[cn].pref_sum = Tr[cn].suff_sum = Tr[cn].all_mul = x;
- return;
- }
- int lc = 2*cn, rc = lc + 1;
- int mid = (b+e)/2;
- if(i <= mid) upd(lc,b,mid,i,x);
- else upd(rc,mid+1,e,i,x);
- Tr[cn] = Merge(Tr[lc], Tr[rc]);
- }
- Data query(int cn, int b, int e, int i, int j) {
- if(b > j or e < i) return {0,0,0,0};
- if(b >= i and e <= j) return Tr[cn];
- int lc = 2*cn, rc = lc + 1;
- int mid = (b+e)/2;
- return Merge(query(lc,b,mid,i,j), query(rc,mid+1,e,i,j));
- }
- int res[N];
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- int n, q, K;
- cin >> n >> q >> K;
- vector<pair<int,int>> vec;
- for(int i = 1; i <= n; i++) {
- cin >> a[i];
- vec.push_back({a[i], i});
- }
- build(1,1,n);
- vector<tuple<int,int,int,int>> queries;
- sort(vec.rbegin(), vec.rend());
- for(int qid = 1; qid <= q; qid++) {
- int l, r, p;
- cin >> l >> r >> p;
- queries.push_back(make_tuple(p,l,r,qid));
- }
- sort(queries.begin(), queries.end());
- for(int i = 0; i < q; i++) {
- int p = get<0>(queries[i]);
- int L = get<1>(queries[i]);
- int R = get<2>(queries[i]);
- int qid = get<3>(queries[i]);
- while(vec.size() > 0 && vec.back().first < p) {
- int idx = vec.back().second;
- vec.pop_back();
- upd(1,1,n,idx,K);
- }
- Data T = query(1,1,n,L,R);
- res[qid] = T.res;
- }
- for(int i = 1; i <= q; i++) {
- cout << res[i] << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement