代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int read(){
int s=0,w=1;char c=getchar();
while(!isdigit(c)){ if(!isdigit(c)) w=-1;c=getchar();}
while(isdigit(c)){ s=(s<<3)+(s<<1)+(c^48);c=getchar();}
return s*w;
}
int m,tot;
int val[N],ch[N][2],rd[N],sz[N];
void pu(int x){
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
int new_node(int v){
val[++tot]=v,rd[tot]=rand(),sz[tot]=1;
return tot;
}
void split(int now,int v,int &x,int &y){
if(!now) return x=y=0,void();
if(val[now]<=v) x=now,split(ch[now][1],v,ch[now][1],y);
else y=now,split(ch[now][0],v,x,ch[now][0]);
pu(now);
}
int merge(int x,int y){
if(!x || !y) return x+y;
if(rd[x]<=rd[y]){
ch[x][1]=merge(ch[x][1],y);
pu(x);
return x;
}
ch[y][0]=merge(x,ch[y][0]);
pu(y);
return y;
}
int kth(int now,int k){
while(true){
if(k<=sz[ch[now][0]]) now=ch[now][0];
else if(k==sz[ch[now][0]]+1) return now;
else k-=sz[ch[now][0]]+1,now=ch[now][1];
}
}
int main(){
srand(time(0));
m=read();
int x,y,z,rt=0;
while(m--){
int opt=read(),v=read();
if(opt==1){
split(rt,v,x,y);
rt=merge(merge(x,new_node(v)),y);
}
else if(opt==2){
split(rt,v,x,z);
split(x,v-1,x,y);
y=merge(ch[y][0],ch[y][1]);
rt=merge(merge(x,y),z);
}
else if(opt==3){
split(rt,v-1,x,y);
printf("%d\n",sz[x]+1);
rt=merge(x,y);
}
else if(opt==4) printf("%d\n",val[kth(rt,v)]);
else if(opt==5){
split(rt,v-1,x,y);
printf("%d\n",val[kth(x,sz[x])]);
rt=merge(x,y);
}
else{
split(rt,v,x,y);
printf("%d\n",val[kth(y,1)]);
rt=merge(x,y);
}
}
return 0;
}