Matrix_code

data-structure - Dynamic Range Segment Tree

Mar 27th, 2020 (edited)
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct node {
  5.   node *left, *right;
  6.   int sz;
  7.   node() {}
  8.   node(int b, int e) : left(nullptr), right(nullptr) { sz = e - b + 1; }
  9. };
  10. void update(node *n, int b, int e, int k) {
  11.   if (b == e) {
  12.     n->sz = 0;
  13.     return;
  14.   }
  15.   int mid = (b + e) / 2;
  16.   if (!n->left)
  17.     n->left = new node(b, mid);
  18.   if (!n->right)
  19.     n->right = new node(mid + 1, e);
  20.   if (n->left->sz >= k)
  21.     update(n->left, b, mid, k);
  22.   else
  23.     update(n->right, mid + 1, e, k - n->left->sz);
  24.   n->sz = n->left->sz + n->right->sz;
  25. }
  26.  
  27. int query(node *n, int b, int e, int k) {
  28.   if (b == e) {
  29.     return b;
  30.   }
  31.   int mid = (b + e) / 2;
  32.   if (!n->left)
  33.     n->left = new node(b, mid);
  34.   if (!n->right)
  35.     n->right = new node(mid + 1, e);
  36.  
  37.   if (n->left->sz >= k)
  38.     return query(n->left, b, mid, k);
  39.   else
  40.     return query(n->right, mid + 1, e, k - n->left->sz);
  41. }
  42.  
  43. int main() {
  44.  
  45.   int n, q;
  46.   scanf("%d %d", &n, &q);
  47.   node *root = new node(1, n);
  48.   while (q--) {
  49.     char c;
  50.     int r;
  51.     scanf(" %c %d", &c, &r);
  52.     if (c == 'L') {
  53.       printf("%d\n", query(root, 1, n, r));
  54.     } else
  55.       update(root, 1, n, r);
  56.   }
  57. }
Add Comment
Please, Sign In to add comment