Advertisement
zhukov000

Treap

Dec 28th, 2019
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAX_CNT = 200001;
  4. struct Node
  5. {
  6.   int key, y, cnt;
  7.   int left, right;
  8.  
  9.   Node(int pkey = 0): key(pkey), y(0), left(0), right(0), cnt(1) {}
  10.   void gen_y()
  11.   {
  12.     y = (rand() << 15) | rand();
  13.   }
  14. };
  15.  
  16. Node nodes[MAX_CNT + 1];
  17. int used_nodes = 0;
  18. int root_id = 0; // id of root node
  19.  
  20. int alloc_node()
  21. {
  22.   assert(used_nodes < MAX_CNT);
  23.   used_nodes ++;
  24.   return used_nodes;
  25. }
  26.  
  27. int get_cnt(const int & node)
  28. {
  29.   if (!node) return 0;
  30.   return nodes[node].cnt;
  31. }
  32.  
  33. void update_cnt(const int & node)
  34. {
  35.   int left_cnt = get_cnt(nodes[node].left);
  36.   int right_cnt = get_cnt(nodes[node].right);
  37.   nodes[node].cnt = left_cnt + right_cnt + 1;
  38. }
  39.  
  40. // root [k]: k = 1 .. n
  41. int get_node(const int & node, int k)
  42. {
  43.   if (!node) return node;
  44.   int left_k = get_cnt(nodes[node].left);
  45.   if (k == left_k + 1) return node;
  46.   if (k < left_k + 1)
  47.     return get_node(nodes[node].left, k);
  48.   return get_node(nodes[node].right, k - (left_k + 1));
  49. }
  50.  
  51. // [1 .. k] | [k+1 .. n]
  52. pair<int, int> split(const int & node, int k)
  53. {
  54.   if (!node) return {0, 0};
  55.   int left_k = get_cnt(nodes[node].left);
  56.   if (k <= left_k)
  57.   {
  58.     auto res = split(nodes[node].left, k);
  59.     nodes[node].left = res.second;
  60.     update_cnt(node);
  61.     return {res.first, node};
  62.   }
  63.   else
  64.   {
  65.     auto res = split(nodes[node].right, k - (left_k + 1));
  66.     nodes[node].right = res.first;
  67.     update_cnt(node);
  68.     return {node, res.second};
  69.   }
  70. }
  71.  
  72. int merge(const int & node1, const int & node2)
  73. {
  74.   if (!node1) return node2;
  75.   if (!node2) return node1;
  76.   if ( nodes[node1].y <= nodes[node2].y )
  77.   { // node1 - root of result merge
  78.     nodes[node1].right = merge(nodes[node1].right, node2);
  79.     update_cnt(node1);
  80.     return node1;
  81.   }
  82.   else
  83.   {
  84.     nodes[node2].left = merge(node1, nodes[node2].left);
  85.     update_cnt(node2);
  86.     return node2;
  87.   }
  88. }
  89.  
  90. // after k
  91. void insert(const int & key, const int & k)
  92. {
  93.   if (k > get_cnt(root_id) + 1) return;
  94.   auto res = split(root_id, k);
  95.   int new_node = alloc_node();
  96.   nodes[new_node].gen_y();
  97.   nodes[new_node].key = key;
  98.   nodes[new_node].cnt = 1;
  99.   root_id = merge(merge(res.first, new_node), res.second);
  100. }
  101.  
  102. void erase(const int & k)
  103. {
  104.   if (k > get_cnt(root_id)) return;
  105.   auto res1 = split(root_id, k);
  106.   auto res2 = split(res1.first, k-1);
  107.   root_id = merge( res2.first, res1.second );
  108. }
  109.  
  110. int main()
  111. {
  112.   ios_base::sync_with_stdio(0);
  113.   cin.tie(0);
  114.   cout.tie(0);
  115.   freopen("INPUT.TXT", "r", stdin);
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement