Advertisement
jrke

Hard Range

Jun 2nd, 2025
584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. struct hardRange {
  2.     int n;
  3.     map<int, set<int>> pos;
  4.     vector<ordered_set> Tree;
  5.  
  6.     hardRange(int size) {
  7.         n = size;
  8.         Tree.resize(4 * n);
  9.     }
  10.  
  11.     void add(int pos, int nxt, int v, int l, int r) {
  12.         if (l > pos || pos > r) return;
  13.         Tree[v].insert(nxt);
  14.         if (l != r) {
  15.             int mid = (l + r) / 2;
  16.             add(pos, nxt, 2 * v, l, mid);
  17.             add(pos, nxt, 2 * v + 1, mid + 1, r);
  18.         }
  19.     }
  20.  
  21.     void remove(int pos, int nxt, int v, int l, int r) {
  22.         if (l > pos || pos > r) return;
  23.         Tree[v].erase(Tree[v].find_by_order(Tree[v].order_of_key(nxt)));
  24.         if (l != r) {
  25.             int mid = (l + r) / 2;
  26.             remove(pos, nxt, 2 * v, l, mid);
  27.             remove(pos, nxt, 2 * v + 1, mid + 1, r);
  28.         }
  29.     }
  30.  
  31.     ll rangeQuery(int tl, int tr, int v, int l, int r, int R) {
  32.         if (l > tr || r < tl) return 0;
  33.         if (l >= tl && r <= tr) return Tree[v].size() - Tree[v].order_of_key(R + 1);
  34.         int mid = (l + r) / 2;
  35.         return rangeQuery(tl, tr, 2 * v, l, mid, R) + rangeQuery(tl, tr, 2 * v + 1, mid + 1, r, R);
  36.     }
  37.  
  38.     ll query(int a, int b) {
  39.         return rangeQuery(a, b, 1, 0, n - 1, b);
  40.     }
  41.  
  42.     void rem(int idx, int val) {
  43.         auto it = pos[val].find(idx);
  44.         int nxt = n + val;
  45.         int prev = -1;
  46.         if (it != pos[val].begin()) {
  47.             prev = *(--it);
  48.             it++;
  49.         }
  50.         it++;
  51.         if (it != pos[val].end()) nxt = *it;
  52.         it--;
  53.         remove(idx, nxt, 1, 0, n - 1);
  54.         if (prev != -1) {
  55.             remove(prev, idx, 1, 0, n - 1);
  56.             add(prev, nxt, 1, 0, n - 1);
  57.         }
  58.         pos[val].erase(it);
  59.     }
  60.  
  61.     void insert(int idx, int val) {
  62.         pos[val].insert(idx);
  63.         auto it = pos[val].find(idx);
  64.         int prev = -1;
  65.         int nxt = n + val;
  66.         if (it != pos[val].begin()) {
  67.             prev = *(--it);
  68.             it++;
  69.         }
  70.         it++;
  71.         if (it != pos[val].end()) nxt = *it;
  72.         it--;
  73.         if (prev != -1) {
  74.             remove(prev, nxt, 1, 0, n - 1);
  75.             add(prev, idx, 1, 0, n - 1);
  76.         }
  77.         add(idx, nxt, 1, 0, n - 1);
  78.     }
  79. };
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement