平衡树
int merge(int p1,int p2){//合并两棵treap if(!p1)return p2; if(!p2)return p1; if(z[p1].key<z[p2].key){ z[p1].r=merge(z[p1].r,p2); return p1; } else{ z[p2].l=merge(p1,z[p2].l); return p2; } } pair<int,int>split(int p,int k){//把p拆成两棵树,一棵大小为k,另一棵为n-k if(z[z[p].l].size>=k){ if(!z[p].l)return make_pair(0,p); else{ pair<int,int>px=split(z[p].l,k); int pl=px.first; z[p].l=px.second; return make_pair(pl,p); } } else{ if(z[p].r==0)return make_pair(p,0); else{ pair<int,int>px=split(z[p].r,k-z[z[p].l].size-1); z[p].r=px.first; int pr=px.second; return make_pair(p,pr); } } } int query_min(int p,int v){ int ans=0; while(p){ if(z[p].v>=v)p=z[p].l; else ans+=z[z[p].l].size+1,p=z[p].r; } return ans; } int Insert(int p,int v){ int k=query_min(p,v); pair<int,int>px=split(p,k); int p1=px.first; int p2=nownode; update(p2); int p3=px.second; z[p2].v=v; return merge(merge(p1,p2),p3); }