事实证明我写了这么久的数学题 splay没有下降水平TAT
#include"stdio.h"
#include"iostream"
using namespace std;
const int inf=(int)1e9;
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;
}
struct node {
int key,siz; node *c[2],*fa; node();
node(int v,node*c0,node*c1,node*pa);
inline void pushup();
}Tnull,*null=&Tnull,*root;
node::node(){
c[0]=c[1]=fa=null;
key=0,siz=0;
}
node::node(int v,node*c0,node*c1,node*pa){
c[0]=c0,c[1]=c1,fa=pa;
key=v,siz=1;
}
inline void node::pushup(){
siz=c[0]->siz+c[1]->siz+1;
}
int n,opt,x;
void rotate(node *x,node *&k){
node *y=x->fa,*z=y->fa;
if(root==y) root=x;
if(z!=null) z->c[z->c[1]==y]=x;
int l=y->c[1]==x,r=l^1;
if(x->c[r]!=null) x->c[r]->fa=y;
y->fa=x; x->fa=z;
y->c[l]=x->c[r]; x->c[r]=y;
y->pushup(); x->pushup();
}
void splay(node *x,node *&k){
while (x!=k){
node *y=x->fa,*z=y->fa;
if(y!=k){
if(z->c[0]==y ^ y->c[0]==x) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
node* find_smaller(int val,node*t){
if(t==null) return null;
if(t->key>=val)
return find_smaller(val,t->c[0]);
node *q=find_smaller(val,t->c[1]);
if(q==null||q->key<t->key) return t;
return q;
}
node* find_bigger(int val,node*t){
if(t==null) return null;
if(t->key<=val)
return find_bigger(val,t->c[1]);
node *q=find_bigger(val,t->c[0]);
if(q==null||q->key>t->key) return t;
return q;
}
node* find_rank(int rank,node *x){
node* rk; if (x->c[0]->siz+1==rank) return x;
if (x->c[0]->siz>=rank) rk=find_rank(rank,x->c[0]);
else rk=find_rank(rank-x->c[0]->siz-1,x->c[1]);
x->pushup(); return rk;
}
void smaller_split(int x){
node*t=find_smaller(x,root); splay(t,root);
}
void bigger_split(int x){
node*t=find_bigger(x,root); splay(t,root);
}
void insert(int x){
smaller_split(x);
node*nnode=new node(x,null,root->c[1],root);
root->c[1]->fa=nnode; root->c[1]=nnode;
root->c[1]->pushup(); root->pushup();
}
void delit(int x){
smaller_split(x); node*t;
t=find_rank(root->c[0]->siz+2,root); splay(t,root->c[1]);
node*del=root->c[1]; root->c[1]=root->c[1]->c[1];
root->c[1]->fa=root; delete del;
}
int get_rank(int x){
smaller_split(x);
return root->c[0]->siz+2;
}
int result_rank(int rk){
node*t=find_rank(rk,root);
return t->key;
}
int pre(int x){
smaller_split(x);
return root->key;
}
int npre(int x){
bigger_split(x);
return root->key;
}
int main(){
root=new node(-inf,null,new node(inf,null,null,null),null);
n=read(); root->c[1]->fa=root; root->siz=2;
for(int i=1;i<=n;i++){
opt=read(); x=read();
if(opt==1) insert(x);
else if(opt==2) delit(x);
else { opt-=3;
int ans=opt&2?opt&1?npre(x):pre(x):opt&1?result_rank(x+1):get_rank(x)-1;
printf("%d\n",ans);
}
}
return 0;
}