1+ #pragma once
2+
3+ template <class Node >
4+ struct RBSTBase {
5+ using Ptr = Node*;
6+ template <typename ... Args>
7+ inline Ptr my_new (Args... args) {
8+ return new Node (args...);
9+ }
10+ inline void my_del (Ptr t) { delete t; }
11+ inline Ptr make_tree () const { return nullptr ; }
12+
13+ int size (Ptr t) const { return count (t); }
14+ Ptr merge (Ptr l, Ptr r) {
15+ if (!l || !r) return l ? l : r;
16+ if (int ((rng () * (l->cnt + r->cnt )) >> 32 ) < l->cnt ) {
17+ push (l);
18+ l->r = merge (l->r , r);
19+ return update (l);
20+ } else {
21+ push (r);
22+ r->l = merge (l, r->l );
23+ return update (r);
24+ }
25+ }
26+ pair<Ptr, Ptr> split (Ptr t, int k) {
27+ if (!t) return {nullptr , nullptr };
28+ push (t);
29+ if (k <= count (t->l )) {
30+ auto s = split (t->l , k);
31+ t->l = s.second ;
32+ return {s.first , update (t)};
33+ } else {
34+ auto s = split (t->r , k - count (t->l ) - 1 );
35+ t->r = s.first ;
36+ return {update (t), s.second };
37+ }
38+ }
39+ Ptr build (int l, int r, const vector<decltype (Node::key)>& v) {
40+ if (l + 1 == r) return my_new (v[l]);
41+ int m = (l + r) >> 1 ;
42+ Ptr pm = my_new (v[m]);
43+ if (l < m) pm->l = build (l, m, v);
44+ if (m + 1 < r) pm->r = build (m + 1 , r, v);
45+ return update (pm);
46+ }
47+ Ptr build (const vector<decltype (Node::key)>& v) {
48+ return build (0 , (int )v.size (), v);
49+ }
50+ template <typename ... Args>
51+ void insert (Ptr& t, int k, const Args&... args) {
52+ auto x = split (t, k);
53+ t = merge (merge (x.first , my_new (args...)), x.second );
54+ }
55+ void erase (Ptr& t, int k) {
56+ auto x = split (t, k);
57+ auto y = split (x.second , 1 );
58+ my_del (y.first );
59+ t = merge (x.first , y.second );
60+ }
61+
62+ protected:
63+ static uint64_t rng () {
64+ static uint64_t x_ = 123456789ull ;
65+ return x_ ^= x_ << 7 , x_ ^= x_ >> 9 , x_ & 0xFFFFFFFFull ;
66+ }
67+ inline int count (const Ptr t) const { return t ? t->cnt : 0 ; }
68+ virtual void push (Ptr) = 0;
69+ virtual Ptr update (Ptr) = 0;
70+ };
71+
72+ /* *
73+ * @brief Randomized Binary Search Tree (基底クラス)
74+ * @docs docs/binary-search-tree/rbst-base.md
75+ */
0 commit comments