Advertisement
Ritam_C

Addition and sum

Dec 24th, 2021
1,005
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4.  
  5. struct segTree {
  6.     int size = 1;
  7.     vector<ll> sums, ops;
  8.  
  9.     void init(int n) {
  10.         while(size < n) {
  11.             size *= 2;
  12.         }
  13.         ops.assign(2*size, 0);
  14.         sums.assign(2*size, 0);
  15.     }
  16.  
  17.     void modify(int l, int r, ll v, int x, int lx, int rx) {
  18.         if(lx >= r || l >= rx) {
  19.             return;
  20.         }
  21.         if(l <= lx && rx <= r) {
  22.             ops[x] += v;
  23.             sums[x] += v*(ll)(rx-lx);
  24.             return;
  25.         }
  26.         int m = (lx+rx)/2;
  27.         modify(l, r, v, 2*x+1, lx, m);
  28.         modify(l, r, v, 2*x+2, m, rx);
  29.         sums[x] = sums[2*x+1]+sums[2*x+2]+ops[x]*(ll)(rx-lx);        
  30.     }
  31.  
  32.     void modify(int l, int r, ll v) {
  33.         modify(l, r, v, 0, 0, size);
  34.     }
  35.  
  36.     ll getSum(int l, int r, int x, int lx, int rx) {
  37.         if(l >= rx || lx >= r) {
  38.             return 0;
  39.         }
  40.         if(l <= lx && rx <= r) {
  41.             return sums[x];
  42.         }
  43.         int m = (lx+rx)/2;
  44.         return getSum(l, r, 2*x+1, lx, m)+getSum(l, r, 2*x+2, m, rx)+ops[x]*(ll)(min(rx, r)-max(lx, l));
  45.     }
  46.  
  47.     ll getSum(int l, int r) {
  48.         return getSum(l, r, 0, 0, size);
  49.     }
  50. };
  51.  
  52. int main() {
  53.     ios_base::sync_with_stdio(false);
  54.     cin.tie(NULL); cout.tie(NULL);
  55.     int n, m; cin >> n >> m;
  56.     segTree st; st.init(n);
  57.     while(m--) {
  58.         int op; cin >> op;
  59.         if(op == 1) {
  60.             int l, r; ll v;
  61.             cin >> l >> r >> v;
  62.             st.modify(l, r, v);
  63.         } else {
  64.             int l, r; cin >> l >> r;
  65.             cout << st.getSum(l, r) << "\n";
  66.         }
  67.     }
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement