代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <algorithm>
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<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=100005;
int n,tot,root=0,ch[MAXN][2],fa[MAXN],val[MAXN];
int dat[MAXN],siz[MAXN],rep[MAXN];
#define lc ch[x][0]
#define rc ch[x][1]
inline void pushup(int x){
siz[x]=siz[lc]+siz[rc]+1;
}
inline int newnode(int v){
int x=++tot;
siz[x]=1;
val[x]=v;
dat[x]=rand();
lc=rc=0;
return x;
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(dat[x]<dat[y]){
ch[x][1]=merge(ch[x][1],y);
pushup(x);
return x;
}
else{
ch[y][0]=merge(x,ch[y][0]);
pushup(y);
return y;
}
}
void split(int now,int& x,int& y,int v){
if(!now) x=y=0;
else{
if(val[now]<=v){
x=now;
split(ch[now][1],ch[now][1],y,v);
}
else{
y=now;
split(ch[now][0],x,ch[now][0],v);
}
pushup(now);
}
}
inline int kth(int top,int k){
int x=top;
while(1){
if(k<=siz[lc]) x=lc;
else if(k==siz[lc]+1) return x;
else k-=siz[lc]+1,x=rc;
}
}
int main(){
srand((unsigned)time(0));
n=read();
int x,y,z;
for(int i=1;i<=n;i++){
int opt=read();
if(opt==1){
int v=read();
split(root,x,y,v);
root=merge(merge(x,newnode(v)),y);
}
else if(opt==2){
int v=read();
split(root,x,z,v);
split(x,x,y,v-1);
y=merge(ch[y][0],ch[y][1]);
root=merge(merge(x,y),z);
}
else if(opt==3){
int v=read();
split(root,x,y,v-1);
printf("%d\n",siz[x]+1);
root=merge(x,y);
}
else if(opt==4){
int k=read();
printf("%d\n",val[kth(root,k)]);
}
else if(opt==5){
int v=read();
split(root,x,y,v-1);
printf("%d\n",val[kth(x,siz[x])]);
root=merge(x,y);
}
else{
int v=read();
split(root,x,y,v);
printf("%d\n",val[kth(y,1)]);
root=merge(x,y);
}
}
return 0;
}