Iamtui1010

querysum2

Dec 30th, 2021 (edited)
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<vector>
  5. #include<algorithm>
  6. //#include<conio.h>
  7.  
  8. #define long long long
  9. #define nln '\n'
  10.  
  11. using namespace std;
  12.  
  13. vector<long> smt, a, t;
  14. long n, m;
  15.  
  16. void build(long id, long lef, long rig)
  17. {
  18.     if (lef == rig)
  19.     {
  20.         smt[id] = a[lef];
  21.         return;
  22.     }
  23.     long mid = (lef+rig)>>1;
  24.     build(id*2, lef, mid);
  25.     build(id*2+1, mid+1, rig);
  26.     smt[id] = smt[id*2] + smt[id*2+1];
  27. }
  28.  
  29. void push_down(long id)
  30. {
  31.     smt[id*2] += t[id];
  32.     smt[id*2+1] += t[id];
  33.  
  34.     t[id*2] += t[id];
  35.     t[id*2+1] += t[id];
  36.  
  37.     t[id] = 0;
  38. }
  39.  
  40. long get(long id, long lef, long rig, long l, long r)
  41. {
  42.     if (lef > r || rig < l)
  43.         return 0;
  44.     if (lef >= l && rig <= r)
  45.         return smt[id];
  46.     push_down(id);
  47.     long mid = (lef+rig)>>1;
  48.     return get(id*2, lef, mid, l, r) + get(id*2+1, mid+1, rig, l, r);
  49. }
  50.  
  51. void inc(long id, long lef, long rig, long l, long r, long val)
  52. {
  53.     if (lef > r || rig < l)
  54.         return;
  55.     if (lef >= l && rig <= r)
  56.     {
  57.         smt[id] += val;
  58.         t[id] += val*(rig-lef+1);
  59.         return;
  60.     }
  61.     push_down(id);
  62.     long mid = (lef+rig)>>1;
  63.     inc(id*2, lef, mid, l, r, val);
  64.     inc(id*2+1, mid+1, rig, l, r, val);
  65.     smt[id] = smt[id*2] + smt[id*2+1];
  66. }
  67.  
  68. int main()
  69. {
  70.     // Input;
  71.     freopen("querysum2.inp", "r", stdin);
  72.     cin >> n >> m;
  73.     a.resize(n+1, 0);
  74.     for (long i = 1; i <= n; ++i)
  75.         cin >> a[i];
  76.     // Process
  77.     smt.resize(n*4+2, 0);
  78.     t.resize(n*4+2, 0);
  79.     build(1, 1, n);
  80.     for (long i = 1; i <= m; ++i)
  81.     {
  82.         long q;
  83.         cin >> q;
  84.         if (q == 1)
  85.         {
  86.             long lef, rig, val;
  87.             cin >> lef >> rig >> val;
  88.             inc(1, 1, n, lef, rig, val);
  89.         }
  90.         else
  91.         {
  92.             long lef, rig;
  93.             cin >> lef >> rig;
  94.             cout << get(1, 1, n, lef, rig) << nln;
  95.         }
  96.     }
  97.     return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment