Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct hardRange {
- int n;
- map<int, set<int>> pos;
- vector<ordered_set> Tree;
- hardRange(int size) {
- n = size;
- Tree.resize(4 * n);
- }
- void add(int pos, int nxt, int v, int l, int r) {
- if (l > pos || pos > r) return;
- Tree[v].insert(nxt);
- if (l != r) {
- int mid = (l + r) / 2;
- add(pos, nxt, 2 * v, l, mid);
- add(pos, nxt, 2 * v + 1, mid + 1, r);
- }
- }
- void remove(int pos, int nxt, int v, int l, int r) {
- if (l > pos || pos > r) return;
- Tree[v].erase(Tree[v].find_by_order(Tree[v].order_of_key(nxt)));
- if (l != r) {
- int mid = (l + r) / 2;
- remove(pos, nxt, 2 * v, l, mid);
- remove(pos, nxt, 2 * v + 1, mid + 1, r);
- }
- }
- ll rangeQuery(int tl, int tr, int v, int l, int r, int R) {
- if (l > tr || r < tl) return 0;
- if (l >= tl && r <= tr) return Tree[v].size() - Tree[v].order_of_key(R + 1);
- int mid = (l + r) / 2;
- return rangeQuery(tl, tr, 2 * v, l, mid, R) + rangeQuery(tl, tr, 2 * v + 1, mid + 1, r, R);
- }
- ll query(int a, int b) {
- return rangeQuery(a, b, 1, 0, n - 1, b);
- }
- void rem(int idx, int val) {
- auto it = pos[val].find(idx);
- int nxt = n + val;
- int prev = -1;
- if (it != pos[val].begin()) {
- prev = *(--it);
- it++;
- }
- it++;
- if (it != pos[val].end()) nxt = *it;
- it--;
- remove(idx, nxt, 1, 0, n - 1);
- if (prev != -1) {
- remove(prev, idx, 1, 0, n - 1);
- add(prev, nxt, 1, 0, n - 1);
- }
- pos[val].erase(it);
- }
- void insert(int idx, int val) {
- pos[val].insert(idx);
- auto it = pos[val].find(idx);
- int prev = -1;
- int nxt = n + val;
- if (it != pos[val].begin()) {
- prev = *(--it);
- it++;
- }
- it++;
- if (it != pos[val].end()) nxt = *it;
- it--;
- if (prev != -1) {
- remove(prev, nxt, 1, 0, n - 1);
- add(prev, idx, 1, 0, n - 1);
- }
- add(idx, nxt, 1, 0, n - 1);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement