---
tags: codebook
---
{%hackmd theme-dark %}
# randomized binary search tree
```cpp=
#include<iostream>
#include<vector>
#include<random>
#define size_t unsigned
using namespace std;
template<typename T>
struct rdized_bst{
mt19937 rd;
struct node{
T v; size_t sz; node *l,*r;
void update(){sz=1+(l?l->sz:0)+(r?r->sz:0);}
node(const T& x):v(x),sz(1){l=r=nullptr;}
} *root;
void _print(ostream& os,node* cur){
if(!cur) return;
_print(os,cur->l);
os<<cur->v<<' ';
_print(os,cur->r);
}
friend ostream& operator<<(ostream& os,rdized_bst& t){
t._print(os,t.root); return os;
}
node* _merge(node* a,node* b){
if(!a) return b;
if(!b) return a;
uniform_int_distribution<size_t> dis(0,a->sz+b->sz);
if(dis(rd)<a->sz){
a->r=_merge(a->r,b);
a->update();
return a;
}
else{
b->l=_merge(a,b->l);
b->update();
return b;
}
}
void _split(node* cur,T x,node*& a,node*& b){
if(!cur){a=b=nullptr;return;}
if(cur->v<x)
a=cur,_split(cur->r,x,a->r,b),a->update();
else
b=cur,_split(cur->l,x,a,b->l),b->update();
}
void insert(const T& x){
node *l,*r;
_split(root,x,l,r);
root=_merge(_merge(l,new node(x)),r);
}
void erase(const T& k){
node *l,*m,*r;
_split(root,k,l,m);
_split(m,k+1,m,r);
root=_merge(l,r);
}
rdized_bst(const vector<T>& v={}):root(nullptr){
for(const auto& i:v) insert(i);
}
};
int main(){
cin.tie(nullptr);cout.tie(nullptr);
ios::sync_with_stdio(false);
rdized_bst<int> tree;
for(int n=0;n!=1e5;n++)
tree.insert(n);
cout<<tree<<endl;
return 0;
}
```