Advertisement
slash0t

BIT

Aug 2nd, 2024 (edited)
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.12 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);
  10.     }
  11.  
  12.     bit(vector<int>& a) {
  13.         n = a.size();
  14.         MPOW = 1;
  15.         while ((1ll << (MPOW + 1)) <= n) MPOW++;
  16.         tree = vector<int>(n);
  17.         for (int i = 0; i < n; i++) {
  18.             tree[i] += a[i];
  19.             if ((i | (i + 1)) < n) tree[i | (i + 1)] += tree[i];
  20.         }
  21.     }
  22.  
  23.     int sum(int i) {
  24.         int res = 0;
  25.         for (int ii = i; ii >= 0; ii = (ii & (ii + 1)) - 1) {
  26.             res += tree[ii];
  27.         }
  28.         return res;
  29.     }
  30.  
  31.     int sum(int l, int r) {
  32.         return sum(r) - sum(l - 1);
  33.     }
  34.  
  35.     void add(int i, int dif = 1) {
  36.         for (int ii = i; ii < n; ii = ii | (ii + 1)) {
  37.             tree[ii] += dif;
  38.         }
  39.     }
  40.  
  41.     int contains(int i) {
  42.         return sum(i, i);
  43.     }
  44.  
  45.     // how many before
  46.     int order_by_key(int i) {
  47.         return sum(0, i - 1);
  48.     }
  49.  
  50.     // 1 based order
  51.     int element_by_order(int ord) {
  52.         int sum = 0;
  53.         int ret = 0;
  54.         for (int i = 1ll << MPOW; i; i >>= 1) {
  55.             if (ret + (i - 1) >= n) continue;
  56.             if (sum + tree[ret + (i - 1)] >= ord) continue;
  57.             sum += tree[ret + (i - 1)];
  58.             ret += i;
  59.         }
  60.         return ret;
  61.     }
  62. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement