Advertisement
slash0t

pivo

Apr 8th, 2025 (edited)
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. //mt19937_64 rnd = mt19937_64((chrono::high_resolution_clock::now().time_since_epoch().count()));
  2. mt19937_64 rnd = mt19937_64(69);
  3.  
  4. struct bo4ka {
  5.     struct pivo {
  6.         pivo* left = nullptr, * right = nullptr;
  7.         int size, key, priority;
  8.         pivo(int key_, int priority_) : key(key_), priority(priority_), size(1ll) {}
  9.     };
  10.  
  11.     pivo* root;
  12.     bo4ka(pivo* root_) : root(root_) {}
  13.     bo4ka(vector<int>& a) {
  14.         int n = a.size();
  15.  
  16.         pivo* tree = nullptr;
  17.         for (int i = 0; i < n; i++) {
  18.             pivo* now = new pivo(a[i], rnd());
  19.             tree = merge(tree, now);
  20.         }
  21.  
  22.         root = tree;
  23.     }
  24.  
  25.     void upd(pivo* tree) {
  26.         tree->size = 1;
  27.         if (tree->left) tree->size += tree->left->size;
  28.         if (tree->right) tree->size += tree->right->size;
  29.     }
  30.  
  31.     typedef pair<pivo*, pivo*> kega;
  32.  
  33.     // max a key less than min b key
  34.     pivo* merge(pivo* a, pivo* b) {
  35.         if (!a) return b;
  36.         if (!b) return a;
  37.  
  38.         if (a->priority > b->priority) {
  39.             auto right = merge(a->right, b);
  40.             a->right = right;
  41.             upd(a);
  42.             return a;
  43.         }
  44.         else {
  45.             auto left = merge(a, b->left);
  46.             b->left = left;
  47.             upd(b);
  48.             return b;
  49.         }
  50.     }
  51.  
  52.     int sz(pivo* tree) {
  53.         return tree ? tree->size : 0;
  54.     }
  55.  
  56.     kega split(pivo* tree, int k) {
  57.         if (!tree) return { nullptr, nullptr };
  58.  
  59.         if (sz(tree->left) + 1 <= k) {
  60.             kega p = split(tree->right, k - 1 - sz(tree->left));
  61.  
  62.             tree->right = p.first;
  63.             upd(tree);
  64.  
  65.             return { tree, p.second };
  66.         }
  67.         else {
  68.             kega p = split(tree->left, k);
  69.  
  70.             tree->left = p.second;
  71.             upd(tree);
  72.  
  73.             return { p.first, tree };
  74.         }
  75.     }
  76.  
  77.     auto apply(int l, int r, pivo* function(pivo*)) {
  78.         kega q1 = split(root, r);
  79.         kega q2 = split(q1.first, l);
  80.         q2.second = function(q2.second);
  81.         root = merge(q2.first, merge(q2.second, q1.second));
  82.     }
  83.  
  84.     void order(pivo* tree, vector<int>& ord) {
  85.         if (!tree) return;
  86.  
  87.         order(tree->left, ord);
  88.         ord.pb(tree->key);
  89.         order(tree->right, ord);
  90.     }
  91.  
  92.     vector<int> order() {
  93.         vector<int> ord;
  94.         order(root, ord);
  95.         return ord;
  96.     }
  97.  
  98.     // 1 indexed
  99.     pivo* ctrlx(int l, int r) {
  100.         kega q1 = split(root, r);
  101.         kega q2 = split(q1.first, l - 1);
  102.         root = merge(q2.first, q1.second);
  103.         return q2.second;
  104.     }
  105.  
  106.     void ctrlv(pivo* v, int k) {
  107.         kega q = split(root, k);
  108.         root = merge(q.first, merge(v, q.second));
  109.     }
  110. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement