最后一个点T了( 我不理解
#include<iostream>
using namespace std;
struct node{
int val;
int cnt,siz;
int left,right,fa;
}T[1000050];
int n,op,x,root,nth;
void update(int no){
T[no].siz=T[no].cnt+T[T[no].left].siz+T[T[no].right].siz;
}
bool son(int no){
return T[T[no].fa].right==no;
}
void rotate(int no){
int tmp=T[no].fa,tmp2=T[tmp].fa;
bool flag=son(tmp);
if(son(no)==0)
T[tmp].left=T[no].right,T[T[no].right].fa=tmp,
T[no].right=tmp,T[tmp].fa=no;
else
T[tmp].right=T[no].left,T[T[no].left].fa=tmp,
T[no].left=tmp,T[tmp].fa=no;
T[no].fa=tmp2;
update(tmp);
update(no);
if(tmp2==0)return;
if(flag==0)T[tmp2].left=no;
else T[tmp2].right=no;
}
void splay(int no,int target=0){
while(T[no].fa!=target){
if(T[T[no].fa].fa!=target&&son(no)==son(T[no].fa))rotate(T[no].fa);
rotate(no);
}
if(target==0)root=no;
}
void insert(int &no,int val,int lst){
if(no==0){
no=++nth;
T[no].val=val;
T[no].fa=lst;
T[no].siz=T[no].cnt=1;
splay(no);
return;
}
if(T[no].val==val){
++T[no].siz;
++T[no].cnt;
splay(no);
return;
}
if(T[no].val>val)insert(T[no].left,val,no);
else insert(T[no].right,val,no);
}
int kth_num(int no,int rk){
if(no==0)return 0;
if(T[T[no].left].siz>=rk)return kth_num(T[no].left,rk);
if(T[T[no].left].siz<rk&&T[T[no].left].siz+T[no].cnt>=rk){
splay(no);
return T[no].val;
}
return kth_num(T[no].right,rk-T[T[no].left].siz-T[no].cnt);
}
int pre_num(int no,int val){
if(no==0)return -2147483647;
if(T[no].val>=val)return pre_num(T[no].left,val);
int ret1=T[no].val,ret2=pre_num(T[no].right,val);
if(ret2>ret1)return ret2;
splay(no);
return ret1;
}
int nxt_num(int no,int val){
if(no==0)return 2147483647;
if(T[no].val<=val)return nxt_num(T[no].right,val);
int ret1=T[no].val,ret2=nxt_num(T[no].left,val);
if(ret2<ret1)return ret2;
splay(no);
return ret1;
}
int Rank(int val){
pre_num(root,val);
return T[root].cnt+T[T[root].left].siz;
}
void bl(int no){
if(no==0)return;
bl(T[no].left);
for(int i=1;i<=T[no].cnt;i++)cout<<T[no].val<<" ";
bl(T[no].right);
}
void del(int val){
pre_num(root,val+1);
if(T[root].cnt>1){
--T[root].cnt;
--T[root].siz;
return;
}
int L=T[root].left,R=T[root].right;
T[R].fa=0;
root=R;
kth_num(root,1);
T[root].left=L;
T[L].fa=root;
}
int main()
{
cin>>n;
insert(root,-2147483647,0);
insert(root,2147483647,0);
while(n--){
cin>>op>>x;
switch(op){
case 1:{
insert(root,x,0);
break;
}
case 2:{
del(x);
break;
}
case 3:{
cout<<Rank(x)<<endl;
break;
}
case 4:{
cout<<kth_num(root,x+1)<<endl;
break;
}
case 5:{
cout<<pre_num(root,x)<<endl;
break;
}
case 6:{
cout<<nxt_num(root,x)<<endl;
break;
}
}
}
return 0;
}