输出是随机的,所以有时全错QAQ
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
int v,k,l,r,s;
};
node tree[100005];
int n;
int tot=0,root=0;
int newnode(int v)
{
tree[++tot].v=v;
tree[tot].k=rand();
tree[tot].s=1;
return tot;
}
int pushup(int p)
{
tree[p].s=tree[tree[p].l].s+tree[tree[p].r].s+1;
}
void split(int p,int v,int &x,int &y)
{
if (p==0)
{
x=0,y=0;
return;
}
if (tree[p].v<=v)
{
x=p;
split(tree[p].r,v,tree[p].r,y);
}
else
{
y=p;
split(tree[p].l,v,x,tree[p].l);
}
pushup(p);
}
int merge(int x,int y)
{
if (!x || !y)
return x+y;
if (tree[x].k<tree[y].k)
{
tree[x].r=merge(tree[x].r,y);
pushup(x);
return x;
}
else
{
tree[y].l=merge(x,tree[y].l);
pushup(y);
return y;
}
}
void ins(int v)
{
int x,y,z;
split(root,v,x,y);
z=newnode(v);
root=merge(merge(x,z),y);
}
void del(int v)
{
int x,y,z;
split(root,v,x,y);
split(x,v-1,x,y);
y=merge(tree[y].l,tree[y].r);
root=merge(merge(x,y),z);
}
int get_k(int p,int k)
{
if (k<=tree[tree[p].l].s)
return get_k(tree[p].l,k);
if (k==tree[tree[p].l].s+1);
return p;
return get_k(tree[p].r,k-tree[tree[p].l].s-1);
}
int get_p(int v)
{
int x,y,ans;
split(root,v-1,x,y);
ans=tree[x].s+1;
root=merge(x,y);
return ans;
}
int get_s(int v)
{
int k,ans;
k=get_k(root,v);
ans=tree[k].v;
return ans;
}
int get_q(int v)
{
int x,y,ans;
split(root,v-1,x,y);
int k=get_k(x,tree[x].s);
ans=tree[k].v;
root=merge(x,y);
return ans;
}
int get_h(int v)
{
int x,y,ans;
split(root,v,x,y);
int k=get_k(y,1);
ans=tree[k].v;
root=merge(x,y);
return ans;
}
signed main()
{
srand(time(0));
cin>>n;
while (n--)
{
int o,k;
cin>>o>>k;
if (o==1)
ins(k);
else if (o==2)
del(k);
else if (o==3)
cout<<get_p(k)<<'\n';
else if (o==4)
cout<<get_s(k)<<'\n';
else if (o==5)
cout<<get_q(k)<<'\n';
else if (o==6)
cout<<get_h(k)<<'\n';
}
return 0;
}