Advertisement
slash0t

BIT

Aug 2nd, 2024 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.87 KB | None | 0 0
  1. struct bit {
  2.     int n, MPOW;
  3.  
  4.     vector<int> tree;
  5.  
  6.     bit(int n) : n(n) {
  7.         MPOW = 1;
  8.         while ((1ll << (MPOW + 1)) <= n) MPOW++;
  9.         tree = vector<int>(n, 0);
  10.     }
  11.  
  12.     int sum(int i) {
  13.         int res = 0;
  14.         for (int ii = i; ii >= 0; ii = (ii & (ii + 1)) - 1) {
  15.             res += tree[ii];
  16.         }
  17.         return res;
  18.     }
  19.  
  20.     int sum(int l, int r) {
  21.         return sum(r) - sum(l - 1);
  22.     }
  23.  
  24.     void add(int i, int dif = 1) {
  25.         for (int ii = i; ii < n; ii = ii | (ii + 1)) {
  26.             tree[ii] += dif;
  27.         }
  28.     }
  29.  
  30.     int contains(int i) {
  31.         return sum(i, i);
  32.     }
  33.  
  34.     // how many before
  35.     int order_by_key(int i) {
  36.         return sum(0, i - 1);
  37.     }
  38.  
  39.     // 1 based index
  40.     int element_by_order(int ord) {
  41.         int sum = 0;
  42.         int ret = 0;
  43.         for (int i = 1ll << MPOW; i && ret + (i - 1) < N; i >>= 1) {
  44.             if (sum + tree[ret + (i - 1)] < ord) {
  45.                 sum += tree[ret + (i - 1)],
  46.                     ret += i;
  47.             }
  48.         }
  49.         return ret;
  50.     }
  51. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement