https://www.cnblogs.com/zwfymqz/p/7151959.html
https://www.luogu.com.cn/problem/solution/P3369?page=2
#include
using namespace std;
const int maxn = 5e5+100;
int ch[maxn][2],pri[maxn],siz[maxn],sz,val[maxn];
int root = 0,x,y,z;
int inline 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 update(int x){
siz[x] = 1+siz[ch[x][0]] +siz[ch[x][1]];
}
inline int new_node(int v){
siz[++sz] = 1;
val[sz] = v;
pri[sz] = rand();
return sz;
}
void split(int now,int k,int &x,int &y){
if(!now) x = y = 0;
else{
if (val[now]<=k){
x = now;
split(ch[now][1],k,ch[now][1],y);
}
else{
y = now;
split(ch[now][0],k,x,ch[now][0]);
}
update(now);
}
}
int merge(int x,int y){
if (!x || !y) return x+y;
if (pri[x]<pri[y]){
ch[x][1] =merge(ch[x][1],y);
update(x);
return x;
}
else{
ch[y][0] = merge(x,ch[y][0]);
update(y);
return y;
}
}
int kth(int now,int k){
while (1){
if (k<=siz[ch[now][0]]) now = ch[now][0];
else if (k == siz[ch[now][0]]+1) return now;
else k-=siz[ch[now][0]]+1,now = ch[now][1];
}
}
int main(){
srand((unsigned)time(NULL));
int t;
t = read();
while (t--){
int opt,a;
opt = read();
a = read();
if (opt == 1){
split(root,a,x,y);
root = merge(merge(x,new_node(a)),y);
} else
if (opt == 2){
split(root,a,x,z);
split(x,a-1,x,y);
y = merge(ch[y][0],ch[y][1]);
root = merge(merge(x,y),z);
} else
if (opt == 3){
split(root,a-1,x,y);
printf("%d\n",siz[x]+1);
root = merge(x,y);
} else
if (opt==4){
printf("%d\n",val[kth(root,a)]);
}else
if (opt == 5){
split(root,a-1,x,y);
printf("%d\n",val[kth(x,siz[x])]);
root = merge(x,y);
}
else{
split(root,a,x,y);
printf("%d\n",val[kth(y,1)]);
root = merge(x,y);
}
}
}