didedoshka

segtree

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