int merge(int x,int y){
if(!x || !y) return x+y;//如果有一颗为空,那么只要返回不为空的那一颗就行了
if(rd[x]<rd[y]){ //treap的做法,比较他们的优先值
ch[x][1]=merge(ch[x][1],y);
up(x);return x; // 将x的右子树与y合并为一颗,那么目前的x就是合并后的树
}
else{
ch[y][0]=merge(x,ch[y][0]);
up(y);return y;//反之亦然
}
}
void split(int now,int k,int &x,int &y){//意思是将now树,以k为分割点(大于k在右边,小于K在左边),分为x,y两棵树
if(!now) x=y=0;//如果now 树为空,那么x,y树都为空.
else{
if(val[now]<=k){
x=now,split(ch[now][1],k,ch[now][1],y);
}
else
y=now,split(ch[now][0],k,x,ch[now][0]);
up(now);
}
}
int insert(int &root,int x){//原树是root,要插入x这个点
int a,b;
int v=val[x];
split(root,v,a,b);
root=marge(marge(a,x),b);
}
原文:https://www.cnblogs.com/czj2005/p/9601131.html