#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,root,ans;
inline int rand_int(){return rand()<<14|rand();}
struct TTreap{
int tot;
struct treap{
int L,R,num,siz,val,pririty;
}p[100005];
inline int new_treap(int x){
p[++tot].num=p[tot].siz=1;
p[tot].val=x;
p[tot].pririty=rand_int();
return tot;
}
inline void pushup(int k){
p[k].siz=p[p[k].L].siz+p[p[k].R].siz+p[k].num;
}
inline void t_left(int &k){
int t=p[k].R;
p[k].R=p[t].L;
p[t].L=k;
p[t].siz=p[k].siz;
pushup(k);
k=t;
}
inline void t_right(int &k){
int t=p[k].L;
p[k].L=p[t].R;
p[t].R=k;
p[t].siz=p[k].siz;
pushup(k);
k=t;
}
inline void insert(int &k,int x){
if(!k) return k=new_treap(x),void();
p[k].siz++;
if(p[k].val==x) p[k].num++;
else if(x>p[k].val){
insert(p[k].R,x);
if(p[p[k].R].pririty<p[k].pririty)
t_left(k);
}
else{
insert(p[k].L,x);
if(p[p[k].L].pririty<p[k].pririty)
t_right(k);
}
}
inline void delet(int &k,int x){
if(!k) return;
if(p[k].val==x){
if(p[k].num>1){
p[k].num--;p[k].siz--;
return;
}
if(p[k].L==0||p[k].R==0){
k=p[k].L|p[k].R;
return;
}
if(p[p[k].L].pririty<p[p[k].R].pririty)
t_right(k);
else t_left(k);
return delet(k,x),void();
}
if(p[k].val<x) delet(p[k].R,x);
else delet(p[k].L,x);
pushup(k);
}
inline int ask_rank(int k,int x){
if(!k) return 1;
if(p[k].val==x) return p[p[k].L].siz+1;
if(x>p[k].val)
return p[p[k].L].siz+p[k].num+ask_rank(p[k].R,x);
return ask_rank(p[k].L,x);
}
inline int rank(int k,int x){
if(!k) return 0;
if(x<=p[p[k].L].siz) return rank(p[k].L,x);
if(x>p[p[k].L].siz+p[k].num)
return rank(p[k].R,x-p[p[k].L].siz-p[k].num);
return p[k].val;
}
inline void ask_pre(int k,int x){
if(!k) return;
if(p[k].val<x)
ans=k,ask_pre(p[k].R,x);
else ask_pre(p[k].L,x);
}
inline void ask_sub(int k,int x){
if(!k) return;
if(p[k].val>x)
ans=k,ask_sub(p[k].L,x);
else ask_sub(p[k].R,x);
}
}T;
inline int read(){
register int x=0,t=0;
static char ch=getchar();
while(!isdigit(ch)) t|=(ch=='-'),ch=getchar();
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return t?-x:x;
}
signed main(){
srand(124515);
n=read();
while(n--){
int op=read(),x=read();
if(op==1) T.insert(root,x);
if(op==2) T.delet(root,x);
if(op==3) printf("%lld\n",T.ask_rank(root,x));
if(op==4) printf("%lld\n",T.rank(root,x));
if(op==5) T.ask_pre(root,x),printf("%lld\n",T.p[ans].val);
if(op==6) T.ask_sub(root,x),printf("%lld\n",T.p[ans].val);
// cout<<root<<endl;
// for(register int i=1;i<=T.tot;i++){
// cout<<T.p[i].val<<" "<<T.p[i].siz<<" "<<T.p[i].num<<" "<<T.p[i].L<<" "<<T.p[i].R<<endl;
// }
}
return 0;
}
in:
4
1 10
1 30
1 20
3 21
out:
3
上面这个数据,本地输出3,交上去是5