#include #include #include #include #include using namespace std; mt19937 gen(time(0)); int fr() { return uniform_int_distribution(0, INT_MAX)(gen); } struct Treap { int x; int y; int sz; Treap* left; Treap* right; Treap (int y_) : x(fr()), y(y_), sz(1), left(nullptr), right(nullptr) { } }; typedef Treap* Node; int get_sz (Node t) { if (t == nullptr) {return 0;} return t->sz; } void sz_recalc (Node t) { if (t == nullptr) return; t->sz = get_sz (t->left) + get_sz (t->right) + 1; } Node treap_merge (Node t1, Node t2) { if (t1 == nullptr) return t2; if (t2 == nullptr) return t1; if (t1->x > t2->x) { t1->right = treap_merge (t1->right, t2); sz_recalc (t1); return t1; } t2->left = treap_merge (t1, t2->left); sz_recalc (t2); return t2; } void treap_print (Node t) { if (t == nullptr) return; cout << "["; treap_print (t->left); cout << " (" << t->x << ", " << t->y << ", " << t->sz << ") "; treap_print (t->right); cout << "]"; } pair treap_split_k (Node t, int k) { if (t == nullptr) return {nullptr, nullptr}; if (k <= get_sz (t->left)) { auto p = treap_split_k (t->left, k); t->left = p.second; sz_recalc (t); return {p.first, t}; } auto p = treap_split_k (t->right, k - get_sz(t->left) - 1); t->right = p.first; sz_recalc (t); return {t, p.second}; } Node treap_insert_k (Node t0, int k, int y0) { auto p = treap_split_k (t0, k); Node t = new Treap (y0); return treap_merge( p.first, treap_merge (t, p.second) ); } Node treap_find_k (Node t, int k) { if (t == nullptr) return nullptr; if (k == get_sz (t->left)) return t; if (k < get_sz (t->left)) return treap_find_k (t->left, k); return treap_find_k (t->right, k - get_sz(t->left) - 1); } int main ( ) { Node t0 = new Treap (0); for (int i=1; i<11; i++) t0 = treap_insert_k(t0, 0, i); treap_print(t0); cout << endl; return 0; }