Advertisement
newb_ie

Segment Tree

Dec 13th, 2020
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. /*
  2. ======================
  3. [     ___T_          ]
  4. [    | 6=6 | =>HI :-)]
  5. [    |__o__|         ]
  6. [ >===]__o[===<      ]
  7. [     [o__]          ]
  8. [      .".           ]
  9. [      |_|           ]
  10. [                    ]
  11. ======================
  12. */
  13.  
  14. #include <bits/stdc++.h>
  15. using namespace std;
  16.  
  17. struct Tree {
  18.     int size = 1;
  19.     vector<int64_t> sums;
  20.     void init (int n) {
  21.         while (size < n) size *= 2;
  22.         sums.assign(2 * size,0LL);
  23.     }
  24.    
  25.     void build (vector<int> &a,int x,int lx,int rx) {
  26.         if (rx - lx == 1) {
  27.             if (lx < (int) a.size()) {
  28.                 sums[x] = a[lx];
  29.             }
  30.             return;
  31.         }
  32.         int m = (lx + rx) / 2;
  33.         build (a,2 * x + 1,lx,m);
  34.         build (a,2 * x + 2,m,rx);
  35.         sums[x] = sums[2 * x + 1] + sums[2 * x + 2];
  36.     }
  37.    
  38.     void build (vector<int> &a) {
  39.         build (a,0,0,size);
  40.     }
  41.    
  42.     void set (int i,int v,int x,int lx,int rx) {
  43.         if (rx - lx == 1) {
  44.             sums[x] = v;
  45.             return;
  46.         }
  47.         int m = (lx + rx) / 2;
  48.         if (i < m) {
  49.             set (i,v,2 * x + 1,lx,m);
  50.         } else {
  51.             set (i,v,2 * x + 2,m,rx);
  52.         }
  53.         sums[x] = sums[2 * x + 1] + sums[2 * x + 2];
  54.     }
  55.     void set (int i,int v) {
  56.         set (i,v,0,0,size);
  57.     }
  58.     int64_t sum (int l,int r,int x,int lx,int rx) {
  59.         if (lx >= r or l >= rx) return 0;
  60.         if (lx >= l and rx <= r) return sums[x];
  61.         int m = (lx + rx) / 2;
  62.         int64_t s1 = sum(l,r,2 * x + 1,lx,m);
  63.         int64_t s2 = sum (l,r,2 * x + 2,m,rx);
  64.         return s1 + s2;
  65.     }
  66.     int64_t sum (int l,int r) {
  67.         return sum(l,r,0,0,size);
  68.     }
  69. };
  70.  
  71. int main () {
  72.      ios::sync_with_stdio(false);
  73.      cin.tie(nullptr);
  74.      cout.tie(nullptr);
  75.      int T = 1;
  76.      //~ cin >> T;
  77.      for (int test_case = 1; test_case <= T; ++test_case) {
  78.          int n,m;
  79.          cin >> n >> m;
  80.          Tree st;
  81.          st.init(n);
  82.          vector<int> a(n);
  83.          for (int i = 0; i < n; ++i) {
  84.              cin >> a[i];
  85.          }
  86.          st.build (a);
  87.          for (int i = 1; i <= m; ++i) {
  88.              int type;
  89.              cin >> type;
  90.              if (type == 1) {
  91.                  int idx,v;
  92.                  cin >> idx >> v;
  93.                  st.set(idx,v);
  94.              } else {
  95.                  int l,r;
  96.                  cin >> l >> r;
  97.                  cout << st.sum(l,r) << "\n";
  98.              }
  99.          }
  100.      }
  101.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement