Advertisement
Guest User

Persistent Segment Tree

a guest
Oct 24th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 1e5 + 10;
  5. struct node{
  6.     node *l, *r;
  7.     int cnt;
  8.  
  9.     node () {}  
  10. };
  11.  
  12. node pool[(1 << 17) * 17];
  13. int tcnt;
  14.  
  15. node* alloc(){
  16.     memset(pool + tcnt, 0, sizeof(node));
  17.     return pool + tcnt++;
  18. }
  19.  
  20. node *tree_head[MAXN];
  21.  
  22. node * init(int l, int r){
  23.     node *ret = alloc();
  24.     if(l != r) {
  25.         int mid = (l + r) / 2;
  26.         ret->l = init(l, mid);
  27.         ret->r = init(mid + 1, r);
  28.     }
  29.     return ret;
  30. }
  31.  
  32. void update(node * here, node *par, int l, int r, int val){
  33.     if(l == r) {
  34.         here->cnt = par->cnt + 1;
  35.         return;
  36.     }
  37.  
  38.     int mid = (l + r) / 2;
  39.     if(val <= mid){
  40.         here->l = alloc();
  41.         here->r = par->r;
  42.         update(here->l, par->l, l, mid, val);
  43.     }
  44.     else {
  45.         here->l = par->l;
  46.         here->r = alloc();
  47.         update(here->r, par->r, mid + 1, r, val);
  48.     }
  49.     here->cnt = here->l->cnt + here->r->cnt;
  50. }
  51.  
  52. int query(node *node1, node *node2, int l, int r, int k){
  53.     if(l == r) return l;
  54.     int ccc = node1->l->cnt - node2->l->cnt;
  55.     int mid = (l + r) / 2;
  56.     if(k <= ccc) return query(node1->l, node2->l, l, mid, k);
  57.     else return query(node1->r, node2->r, mid + 1, r, k - ccc);
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement