---
tags: codebook
---
# Splay Tree
```cpp=
#include<iostream>
#include<array>
#include<vector>
using namespace std;
struct splay_tree{
struct node{
int val; node *p;
array<node*,2> ch;
node(const int& x,node* anc):
val(x),p(anc){ch[0]=ch[1]=nullptr;}
bool side() const {
return this==this->p->ch[1];
}
void attach(bool direc, node *const ptr){
if(ptr) ptr->p=this;
this->ch[direc]=ptr;
}
void rotate(){
const auto anc = this->p;
const bool direc=this->side();
if(anc->p)
anc->p->attach(this->p->side(), this);
else
this->p = nullptr;
anc->attach(direc, this->ch[!direc]);
this->attach(!direc, anc);
}
node* splay(){
while(this->p)
if(!this->p->p) this->rotate();
else this->p->rotate(), this->rotate();
return this;
}
}*root;
bool insert(const int& x){
node **cur=&root,*anc=nullptr;
while(*cur&&(*cur)->val!=x)
anc=*cur,cur=&((*cur)->ch[x>(*cur)->val]);
if(*cur) return false;
*cur=new node(x,anc),root=(*cur)->splay();
return true;
}
void merge(splay_tree&& b){
node *cur=root;
while(cur->ch[1]) cur=cur->ch[1];
root=cur->splay();
this->root->ch[1]=b.root;
b.root->p=this->root;
b.root=nullptr;
}
bool erase(const int& x){
node *cur=root;
while(cur&&cur->val!=x) cur=cur->ch[x>cur->val];
if(!cur) return false;
root=cur->splay();
for(int i=0;i!=2;i++){
if(!root->ch[i]) {
root=root->ch[!i];
return true;
}
root->ch[i]->p=nullptr;
}
const auto rch=root->ch[1];
root=root->ch[0];
this->merge(splay_tree(rch));
return true;
}
splay_tree(node* x):root(x){}
splay_tree(initializer_list<int> v):root(nullptr){
for(const auto& i:v)
insert(i);
}
};
int main(){
splay_tree tree({1,5,4,2,0,3,6,7,9,8,0});
tree.erase(0);
return 0;
}
```