rt
code:
#include<bits/stdc++.h>
// #pragma GCC optimize(1,2,3,"Ofast","inline")
// #define int long long
#define endl "\n"
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void print(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
}
struct Treap{
struct node{int ls,rs,x,cnt,size;}p[100005];
int cnt=0;//现有点数
inline void pushup(int u){p[u].size=p[p[u].ls].size+p[p[u].rs].size+1;}//自行修改
inline int random(int x,int y){//生成[x,y]之间的随机数
srand(time(0));
int xx=rand()*rand();
return xx%(y-x+1)+x;
}
inline void split(int root,int &a,int &b,int x){//分裂
if(root==0){
a=b=0;
return;
}
if(p[root].x<=x) a=root,split(p[root].rs,p[a].rs,b,x);
else b=root,split(p[root].ls,a,p[b].ls,x);
pushup(root);
}
inline void merge(int &root,int a,int b){//合并
if(!a||!b){
root=a+b;
return ;
}
if(p[a].cnt<p[b].cnt) root=a,merge(p[root].rs,p[a].rs,b);
else root=b,merge(p[root].ls,a,p[b].ls);
pushup(root);
}
inline int makenew(int x){//新建
int root=++cnt;
p[root].size=1;
p[root].x=x;
p[root].ls=p[root].rs=0;
p[root].cnt=random(1,1e9);
return root;
}
inline void insert(int &root,int x_){//插入
int x=0,y=0,n=makenew(x_);
split(root,x,y,x_);
merge(x,x,n);
merge(root,x,y);
}
inline void del(int &root,int x_){//删除
int x=0,y=0,z=0;
split(root,x,y,x_);
split(x,x,z,x_-1);
merge(z,p[z].ls,p[z].rs);
merge(x,x,z);
merge(root,x,y);
}
inline int find1(int root,int x){//查找排名为x的数
while(p[p[root].ls].size+1!=x){
if(p[p[root].ls].size<x) x-=p[p[root].ls].size+1,root=p[root].rs;
else root=p[root].ls;
}
return p[root].x;
}
inline int find2(int &root,int x_){//查找x的排名
//记得+1
int x=0,y=0;
split(root,x,y,x_-1);
int t=p[x].size;
merge(root,x,y);
return t;
}
inline int find3(int &root,int x_){//返回x的前驱
int x=0,y=0;
split(root,x,y,x_-1);
int t=find1(x,p[x].size);
merge(root,x,y);
return t;
}
inline int find4(int &root,int x_){//返回x的后继
int x=0,y=0;
split(root,x,y,x_);
int t=find1(y,1);
merge(root,x,y);
return t;
}
};
Treap tree;
int n,root;
void solve(){
n=read();
for(int i=1;i<=n;i++){
int op=read(),x=read();
if(op==1) tree.insert(root,x);
if(op==2) tree.del(root,x);
if(op==3) print(tree.find2(root,x)+1),putchar('\n');
if(op==4) print(tree.find1(root,x)),putchar('\n');
if(op==5) print(tree.find3(root,x)),putchar('\n');
if(op==6) print(tree.find4(root,x)),putchar('\n');
}
}
signed main(){
int T=1;
// T=read();
while(T--) solve();
return 0;
}