Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int mod = 1e9 + 7, N = 5e5 + 100;
  5.  
  6. struct Data {
  7. int res, suff_sum, pref_sum, all_mul;
  8. }Tr[4*N];
  9.  
  10. int a[N];
  11.  
  12. Data Merge(Data a, Data b) {
  13. Data ret;
  14. ret.res = a.res + b.res;
  15. if(ret.res >= mod) ret.res -= mod;
  16. int t = 1ll*a.suff_sum*b.pref_sum%mod;
  17. ret.res += t;
  18. if(ret.res >= mod) ret.res -= mod;
  19. ret.pref_sum = a.pref_sum + (1ll*a.all_mul*b.pref_sum%mod);
  20. if(ret.pref_sum >= mod) ret.pref_sum -= mod;
  21. ret.suff_sum = b.suff_sum + (1ll*b.all_mul*a.suff_sum%mod);
  22. if(ret.suff_sum >= mod) ret.suff_sum -= mod;
  23. ret.all_mul = 1ll*a.all_mul*b.all_mul%mod;
  24. return ret;
  25. }
  26.  
  27. void build(int cn, int b, int e) {
  28. if(b == e) {
  29. Tr[cn].res = Tr[cn].pref_sum = Tr[cn].suff_sum = Tr[cn].all_mul = a[b];
  30. return;
  31. }
  32. int lc = 2*cn, rc = lc + 1;
  33. int mid = (b+e)/2;
  34. build(lc, b, mid);
  35. build(rc, mid+1, e);
  36. Tr[cn] = Merge(Tr[lc], Tr[rc]);
  37. }
  38.  
  39. void upd(int cn, int b, int e, int i, int x) {
  40. if(b == e) {
  41. Tr[cn].res = Tr[cn].pref_sum = Tr[cn].suff_sum = Tr[cn].all_mul = x;
  42. return;
  43. }
  44. int lc = 2*cn, rc = lc + 1;
  45. int mid = (b+e)/2;
  46. if(i <= mid) upd(lc,b,mid,i,x);
  47. else upd(rc,mid+1,e,i,x);
  48. Tr[cn] = Merge(Tr[lc], Tr[rc]);
  49. }
  50.  
  51. Data query(int cn, int b, int e, int i, int j) {
  52. if(b > j or e < i) return {0,0,0,0};
  53. if(b >= i and e <= j) return Tr[cn];
  54. int lc = 2*cn, rc = lc + 1;
  55. int mid = (b+e)/2;
  56. return Merge(query(lc,b,mid,i,j), query(rc,mid+1,e,i,j));
  57. }
  58.  
  59. int res[N];
  60.  
  61. int main() {
  62. ios::sync_with_stdio(0);
  63. cin.tie(0);
  64.  
  65. int n, q, K;
  66. cin >> n >> q >> K;
  67. vector<pair<int,int>> vec;
  68. for(int i = 1; i <= n; i++) {
  69. cin >> a[i];
  70. vec.push_back({a[i], i});
  71. }
  72. build(1,1,n);
  73. vector<tuple<int,int,int,int>> queries;
  74. sort(vec.rbegin(), vec.rend());
  75. for(int qid = 1; qid <= q; qid++) {
  76. int l, r, p;
  77. cin >> l >> r >> p;
  78. queries.push_back(make_tuple(p,l,r,qid));
  79. }
  80. sort(queries.begin(), queries.end());
  81. for(int i = 0; i < q; i++) {
  82. int p = get<0>(queries[i]);
  83. int L = get<1>(queries[i]);
  84. int R = get<2>(queries[i]);
  85. int qid = get<3>(queries[i]);
  86. while(vec.size() > 0 && vec.back().first < p) {
  87. int idx = vec.back().second;
  88. vec.pop_back();
  89. upd(1,1,n,idx,K);
  90. }
  91. Data T = query(1,1,n,L,R);
  92. res[qid] = T.res;
  93. }
  94. for(int i = 1; i <= q; i++) {
  95. cout << res[i] << "\n";
  96. }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement