Advertisement
MathQ_

Untitled

Aug 28th, 2021
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. struct seg_tree {
  2.     vector<int> a;
  3.     vector<int> sum;
  4.  
  5.     seg_tree(vector<int> b) {
  6.         int n = b.size();
  7.         a = b;
  8.         sum.resize(4 * n);
  9.         build(0, 0, n);
  10.     }
  11.  
  12.     void build(int id, int l, int r) {
  13.         if (l + 1 == r) {
  14.             sum[id] = l;
  15.             return;
  16.         }
  17.         int m = (l + r) / 2;
  18.         build(id * 2 + 1, l, m);
  19.         build(id * 2 + 2, m, r);
  20.         sum[id] = sum[id * 2 + 1] + sum[id * 2 + 2];
  21.     }
  22.  
  23.     int get(int id, int l, int r, int lq, int rq) {
  24.         if (l >= rq || lq >= r) {
  25.             return 0;
  26.         }
  27.         if (lq <= l && r <= rq) {
  28.             return sum[id];
  29.         }
  30.         int m = (l + r) / 2;
  31.         int s1 = get(id * 2 + 1, l, m, lq, rq);
  32.         int s2 = get(id * 2 + 2, m, r, lq, rq);
  33.         return s1 + s2;
  34.     }
  35.  
  36.     void upd(int id, int l, int r, int i, int x) {
  37.         if (l + 1 == r) {
  38.             sum[id] += x;
  39.             return;
  40.         }
  41.         int m = (l + r) / 2;
  42.         if (i < m) {
  43.             upd(id * 2 + 1, l, m, i, x);
  44.         } else {
  45.             upd(id * 2 + 2, m, r, i, x);
  46.         }
  47.         sum[id] = sum[id * 2 + 1] + sum[id * 2 + 2];
  48.     }
  49. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement