我#2~#17都是WA,#2下了测试点人肉对拍是对的,要是我眼瞎的话骂轻点吧QAQ
#2.in
20
1 964673
5 968705
4 1
3 964673
5 965257
1 915269
1 53283
3 964673
3 53283
3 53283
1 162641
5 973984
1 948119
2 915269
2 53283
6 959161
1 531821
1 967521
2 531821
1 343410
#2.out
964673
964673
1
964673
3
1
1
964673
964673
code
#include<bits/stdc++.h>
using namespace std;
struct Tree{
int l,r,val,key,size;
}a[100001];
int n,kind,x,top=0,root=0,Lroot,Mroot,Rroot;
void adde(int now){
a[++top].val=now;
a[top].key=rand();
a[top].l=a[top].r=0;
return;
}
void update(int now){
a[now].size=a[a[now].l].size+a[a[now].r].size+1;
}
void split(int now,int k,int &l,int &r){
if(!now){
l=r=0;
return;
}
if(a[now].val<=k){
l=now;
split(a[now].r,k,a[now].r,r);
}
else{
r=now;
split(a[now].l,k,l,a[now].l);
}
update(now);
}
int merge(int l,int r){
if(!l||!r) return l+r;
if(a[l].key<=a[r].key){
a[l].r=merge(a[l].r,r);
update(l);
return l;
}
else{
a[r].l=merge(l,a[r].l);
update(r);
return r;
}
}
int kth(int now,int x){
if(a[a[now].l].size==x-1){
return now;
}
if(a[a[now].l].size>=x){
return kth(a[now].l,x);
}
else{
return kth(a[now].r,x-a[a[now].l].size-1);
}
}
int main(){
// freopen("P3369_2.in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d",&n);
while(n--){
scanf("%d%d",&kind,&x);
if(kind==1){
split(root,x,Lroot,Rroot);
adde(x);
root=merge(merge(Lroot,top),Rroot);
}
if(kind==2){
split(root,x,Lroot,Rroot);
split(Lroot,x-1,Lroot,Mroot);
Mroot=merge(a[Mroot].l,a[Mroot].r);
root=merge(merge(Lroot,Mroot),Rroot);
}
if(kind==3){
split(root,x-1,Lroot,Rroot);
printf("%d\n",a[Lroot].size+1);
root=merge(Lroot,Rroot);
}
if(kind==4){
printf("%d\n",a[kth(root,x)].val);
}
if(kind==5){
split(root,x-1,Lroot,Rroot);
printf("%d\n",a[kth(Lroot,a[Lroot].size)].val);
root=merge(Lroot,Rroot);
}
if(kind==6){
split(root,x,Lroot,Rroot);
printf("%d\n",a[kth(Rroot,1)].val);
root=merge(Lroot,Rroot);
}
}
return 0;
}