Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define maxn 500005
  5. #define ll long long
  6. #define int long long
  7.  
  8. ll a[maxn] , p[maxn * 4] , addv[maxn * 4];
  9. ll pre[maxn] , ansl[maxn] , ansr[maxn];
  10.  
  11. struct op {
  12. int ql , qr , k;
  13. }b[maxn];
  14.  
  15. struct Query {
  16. int id , ql , qr;
  17. };
  18. vector<Query> v[maxn];
  19.  
  20. int ql , qr , k;
  21.  
  22. void maintain(int o) {
  23. p[o] = p[o * 2] + p[o * 2 + 1];
  24. }
  25.  
  26. void build(int l , int r , int o) {
  27. if(l == r) {
  28. p[o] = a[l];
  29. return ;
  30. }
  31.  
  32. int mid = l + (r - l) / 2;
  33. build(l , mid , o * 2);
  34. build(mid + 1 , r , o * 2 + 1);
  35. maintain(o);
  36. }
  37.  
  38. void push(int l , int r , int o) {
  39. int mid = l + (r - l) / 2;
  40. int lc = o * 2 , rc = o * 2 + 1;
  41.  
  42. if(addv[o]) {
  43. addv[lc] += addv[o];
  44. addv[rc] += addv[o];
  45. p[lc] += (mid - l + 1) * addv[o];
  46. p[rc] += (r - mid) * addv[o];
  47. addv[o] = 0;
  48. }
  49. }
  50.  
  51. void update(int l , int r , int o) {
  52. if(ql <= l && r <= qr) {
  53. p[o] += (r - l + 1) * k;
  54. addv[o] += k;
  55. return ;
  56. }
  57.  
  58. push(l , r , o);
  59. int mid = l + (r - l) / 2;
  60. if(ql <= mid) update(l , mid , o * 2);
  61. if(qr > mid) update(mid + 1 , r , o * 2 + 1);
  62. maintain(o);
  63. }
  64.  
  65. ll query(int l , int r , int o) {
  66. if(ql <= l && r <= qr) {
  67. return p[o];
  68. }
  69.  
  70. push(l , r , o);
  71. int mid = l + (r - l) / 2;
  72. if(qr <= mid) return query(l , mid , o * 2);
  73. else if(ql > mid) return query(mid + 1 , r , o * 2 + 1);
  74. else return query(l , mid , o * 2) + query(mid + 1 , r , o * 2 + 1);
  75. }
  76.  
  77. int32_t main() {
  78. int n , m;
  79. scanf("%lld%lld" , &n , &m);
  80. for(int i = 1; i <= n; i++) {
  81. scanf("%lld" , &a[i]);
  82. }
  83. for(int i = 1; i <= m; i++) {
  84. scanf("%lld%lld%lld" , &b[i].ql , &b[i].qr , &b[i].k);
  85. }
  86.  
  87. for(int i = 1; i <= n; i++) {
  88. pre[i] = pre[i - 1] + a[i];
  89. }
  90.  
  91. int q;
  92. scanf("%lld" , &q);
  93. for(int i = 1; i <= q; i++) {
  94. int l , r;
  95. scanf("%lld%lld%lld%lld" , &ql , &qr , &l , &r);
  96. v[l - 1].push_back((Query){-i , ql , qr});
  97. v[r].push_back((Query){i , ql , qr});
  98. }
  99.  
  100. build(1 , n , 1);
  101.  
  102. for(int i = 0; i < v[0].size(); i++) {
  103. Query u = v[0][i];
  104. ql = u.ql , qr = u.qr;
  105. (u.id < 0 ? ansl[-u.id] : ansr[u.id]) = query(1 , n , 1);
  106. if(u.id > 0) ansr[u.id] += pre[qr] - pre[ql - 1];
  107. }
  108.  
  109. for(int i = 1; i <= m; i++) {
  110. ql = b[i].ql;
  111. qr = b[i].qr;
  112. k = b[i].k;
  113. update(1 , n , 1);
  114.  
  115. for(int j = 0; j < v[i].size(); j++) {
  116. Query u = v[i][j];
  117. ql = u.ql , qr = u.qr;
  118. (u.id < 0 ? ansl[-u.id] : ansr[u.id]) = query(1 , n , 1);
  119. if(u.id > 0) ansr[u.id] += pre[qr] - pre[ql - 1];
  120. }
  121. }
  122.  
  123. for(int i = 1; i <= q; i++) {
  124. printf("%lld\n" , ansr[i] - ansl[i]);
  125. }
  126. return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement