#include <bits/stdc++.h>
using namespace std;
//typedef long long q;
const int N=1e5;
struct node{
int key,pri;
int ls,rs;
int size;
}t[N];
int cnt,root;
void newnode(int x){
t[++cnt].key=x,t[cnt].pri=rand();
t[cnt].ls=t[cnt].rs=0;
t[cnt].size=1;
}
void update(int u){
t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void Split(int u,int x,int& L,int& R){
if(u==0){
L=R=0;
return;
}
if(t[u].key<=x){
L=u;
Split(t[u].rs,x,t[u].rs,R);
}
else{
R=u;
Split(t[u].ls,x,L,t[u].ls);
}
update(u);
}
int Merge(int L,int R){
if(L==0||R==0)return L+R;
if(t[L].pri>t[R].pri){
t[L].rs=Merge(t[L].rs,R);
update(L);
return L;
}
else{
t[R].ls=(L,t[R].ls);
update(R);
return R;
}
}
void insert(int x){
int L,R;
Split(root,x,L,R);
newnode(x);
root=Merge(Merge(L,cnt),R);
}
void del(int x){
int L,R,p;
Split(root,x,L,R);
Split(L,x-1,L,p);
p=Merge(t[p].ls,t[p].rs);
root=Merge(Merge(L,p),R);
}
void Rank(int x){
int L,R;
Split(root,x-1,L,R);
printf("%d\n",t[L].size+1);
root=Merge(L,R);
}
int kth(int u,int k){
if(k==t[t[u].ls].size+1)return u;
else if(k>t[t[u].ls].size) return kth(t[u].rs,k-(t[t[u].ls].size+1));
else kth(t[u].ls,k);
}
void pre(int x){
int L,R;
Split(root,x-1,L,R);
printf("%d\n",t[kth(L,t[L].size)].key);
root=Merge(L,R);
}
void nxt(int x){
int L,R;
Split(root,x,L,R);
printf("%d\n",t[kth(R,1)].key);
root=Merge(L,R);
}
int main(){
srand(time(0));
int n;
cin>>n;
while(n--){
int opt,x;
cin>>opt>>x;
switch(opt){
case 1:insert(x);break;
case 2:del(x);break;
case 3:Rank(x);break;
case 4:printf("%d\n",t[kth(root,x)].key);break;
case 5:pre(x);break;
case 6:nxt(x);break;
}
}
return 0;
}
时不时0分,7分,14分,28分