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);
}