rt,下了#9测试点自己对拍了一下,发现问题都出现在3、4操作上,所有3操作输出少1,4操作输出偏大,不知道是哪里出了问题
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=1e5+5;
int n;
int K[N],KK[N],Top,cnt;
int root,rootl,rootr;
int ans[N],p,e[N],ee[N];
struct sss {
int key,val,siz;
int fat,son[2];
} tre[N];
int cmp(int x,int y) {
return KK[x]<=KK[y];
}
inline void push_up(int now) {
tre[now].siz=tre[tre[now].son[0]].siz+tre[tre[now].son[1]].siz+1;
}
void split(int now,int k,int <,int &rt) {
if(!now) {
lt=rt=0;
return ;
}
if(tre[now].val<=k) {
lt=now;
split(tre[now].son[1],k,tre[now].son[1],rt);
} else {
rt=now;
split(tre[now].son[0],k,lt,tre[now].son[0]);
}
push_up(now);
}
int merge(int lt,int rt) {
if(!lt||!rt) return lt+rt;
if(tre[lt].key<tre[rt].key) {
tre[lt].son[1]=merge(tre[lt].son[1],rt);
push_up(lt);
return lt;
} else {
tre[rt].son[0]=merge(lt,tre[rt].son[0]);
push_up(rt);
return rt;
}
}
void f1(int x) {
if(!root) {
root=++cnt;
tre[cnt].val=x;
tre[cnt].key=K[++Top];
tre[cnt].siz=1;
return ;
}
split(root,x-1,rootl,rootr);
tre[++cnt].val=x;
tre[cnt].key=K[++Top];
tre[cnt].siz=1;
rootl=merge(rootl,cnt);
root=merge(rootl,rootr);
}
void f2(int x) {
split(root,x,rootl,rootr);
int lt,rt;
split(rootl,x-1,lt,rt);
rt=tre[rt].son[(tre[rt].son[1]>tre[rt].son[0])];
rootl=merge(lt,rt);
root=merge(rootl,rootr);
}
void f3(int x) {
split(root,x-1,rootl,rootr);
printf("%d\n",tre[rootl].siz+1);
ans[++p]=tre[rootl].siz+1;
e[p]=3;
root=merge(rootl,rootr);
return ;
}
void f4(int x) {
int o=root;
while(1) {
if(tre[tre[o].son[0]].siz+1==x)
break;
if(x<=tre[tre[o].son[0]].siz+1)
o=tre[o].son[0];
else {
x-=tre[tre[o].son[0]].siz+1;
o=tre[o].son[1];
}
}
printf("%d\n",tre[o].val);
ans[++p]=tre[o].val;
e[p]=4;
}
void f5(int x) {
split(root,x-1,rootl,rootr);
int o=rootl;
while(tre[o].son[1]) o=tre[o].son[1];
printf("%d\n",tre[o].val);
ans[++p]=tre[o].val;
e[p]=5;
root=merge(rootl,rootr);
}
void f6(int x) {
split(root,x,rootl,rootr);
int o=rootr;
while(tre[o].son[0]) o=tre[o].son[0];
printf("%d\n",tre[o].val);
ans[++p]=tre[o].val;
e[p]=6;
root=merge(rootl,rootr);
}
int main() {
srand(time(0));
scanf("%d",&n);
for(int i=1;i<=n;i++) {
K[i]=i;
KK[i]=rand();
}
sort(K+1,K+n+1,cmp);
int opt,x;
while(n--) {
scanf("%d%d",&opt,&x);
if(opt==1) {
f1(x);
}
if(opt==2) {
f2(x);
}
if(opt==3) {
f3(x);
}
if(opt==4) {
f4(x);
}
if(opt==5) {
f5(x);
}
if(opt==6) {
f6(x);
}
}
return 0;
}