WA on #5~#12,
#include<bits/stdc++.h>
using namespace std;
struct node{
int data,value,cnt,left,right,siz;
}z[100005];
int tot,root;
void up(int x){
z[x].siz=z[z[x].left].siz+z[z[x].right].siz+z[x].cnt;
}
void r_rotate(int &x){
int tmp=z[x].left;
z[x].left=z[tmp].right;
z[tmp].right=x;
z[tmp].siz=z[x].siz;
up(x);
x=tmp;
}
void l_rotate(int &x){
int tmp=z[x].right;
z[x].right=z[tmp].left;
z[tmp].left=x;
z[tmp].siz=z[x].siz;
up(x);
x=tmp;
}
void insert(int &x,int data){
if(x==0){
x=++tot;
z[tot].data=data;
z[tot].siz=1;
z[tot].cnt=1;
z[tot].value=rand();
return ;
}
z[x].siz++;
if(data==z[x].data){
z[x].cnt++;
return ;
}else if(data>z[x].data){
insert(z[x].right,data);
}else{
insert(z[x].left,data);
}
up(x);
if(z[x].left!=0&&z[z[x].left].value<z[x].value){
r_rotate(x);
}
if(z[x].right!=0&&z[z[x].right].value<z[x].value){
l_rotate(x);
}
up(x);
}
void remove(int &x,int data){
z[x].siz--;
if(!x){
return ;
}
if(z[x].data==data){
z[x].cnt--;
if(z[x].cnt>0){
up(x);
return;
}
if(z[x].left==0||z[x].right==0){
x=z[x].left+z[x].right;
return;
}else{
if(z[z[x].left].value<z[z[x].right].value){
r_rotate(x);
remove(z[x].right,data);return;
}else{
l_rotate(x);
remove(z[x].left,data);return;
}
}
}
if(z[x].data>data){
remove(z[x].left,data);
}else{
remove(z[x].right,data);
}
up(x);
}
int ran(int x,int data){
if(!x)return 0;
int re=0;
if(z[x].data>data){
re+=ran(z[x].left,data);
}else if(z[x].data==data){
re=z[z[x].left].siz;
}else{
re=z[z[x].left].siz+z[x].cnt;
re+=ran(z[x].right,data);
}
return re;
}
int get_data(int x,int rank){
if(x==0)return 0;
if(rank<=z[z[x].left].siz){
return get_data(z[x].left,rank);
}else if(rank<=z[z[x].left].siz+z[x].cnt){
return z[x].data;
}else{
return get_data(z[x].right,rank-z[x].cnt-z[z[x].left].siz);
}
}
int get_pre(int data){
int x=root;
int pre=0;
while(x){
if(z[x].data>=data)x=z[x].left;
else {
pre=z[x].data;
x=z[x].right;
}
}
return pre;
}
int get_next(int data){
int x=root;
int next=0;
while(x){
if(z[x].data<=data){
x=z[x].right;
}else{
next=z[x].data;
x=z[x].left;
}
}
return next;
}
int t;
int a,b,c,d;
int main(){
// srand(time(0));
cin>>t;
while(t--){
cin>>a;
if(a==1){
cin>>b;
insert(root,b);
}else if(a==2){
cin>>b;
remove(root,b);
}else if(a==3){
cin>>b;
cout<<ran(root,b)+1;puts("");
}else if(a==4){
cin>>b;
cout<<get_data(root,b);puts("");
}else if(a==5){
cin>>b;cout<<get_pre(b);puts("");
}else if(a==6){
cin>>b;
cout<<get_next(b);puts("");
}
}
return 0;
}