rt,已去掉行末空格与结尾回车。
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
mt19937 rnd(time(0));
int read(){
int s=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*f;
}
int T,n,a[N];
struct tree{
int rnk,siz,ls,rs,val;
}t[N];
int root=1,tot;
int add_node(int val){
t[++tot].val=val;
t[tot].siz=1;
t[tot].rnk=rnd();
return tot;
}
inline void update(int x){t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;}
void merge(int &rt,int a,int b){
if(!a||!b) {rt=a+b;return;}
if(t[a].rnk<t[b].rnk){
rt=a;
merge(t[a].rs,t[a].rs,b);
}else{
rt=b;
merge(t[b].ls,a,t[b].ls);
}update(rt);
}
void split(int rt,int &a,int &b,int val){
if(rt==0){a=b=0;return;}
if(t[rt].val<=val){
a=rt;
split(t[a].rs,t[a].rs,b,val);
}else{
b=rt;
split(t[b].ls,a,t[b].ls,val);
}update(rt);
}
void insert(int &rt,int val){
int x=0,y=0,newnode=add_node(val);
split(rt,x,y,val);
merge(x,x,newnode);
merge(rt,x,y);
}
void Delete(int &rt,int val){
int x=0,y=0,z=0;
split(rt,x,y,val);
split(x,x,z,val-1);
merge(z,t[z].ls,t[z].rs);
merge(x,x,z);
merge(rt,x,y);
}
int getkth(int rt,int k){
while(t[t[rt].ls].siz+1!=k){
if(t[t[rt].ls].siz>=k) rt=t[rt].ls;
else k-=t[t[rt].ls].siz+1,rt=t[rt].rs;
}
return t[rt].val;
}
int getrnk(int &rt,int val){
int x=0,y=0;
split(rt,x,y,val-1);
int tmp=t[x].siz+1;
merge(rt,x,y);
return tmp;
}
int getpre(int &rt,int val){
int x=0,y=0;
split(rt,x,y,val-1);
int tmp=getkth(x,t[x].siz);
merge(rt,x,y);
return tmp;
}
int getnxt(int &rt,int val){
int x=0,y=0;
split(rt,x,y,val);
int tmp=getkth(y,1);
merge(rt,x,y);
return tmp;
}
int main(){
add_node(0x3f3f3f3f);
tot=1; t[1].siz=0;
T=read();
while(T--){
n=read();
for(int i=1;i<=n;i++) insert(root,i);
for(int i=1;i<=n;i++){
int t=getkth(root,read()+1);
printf("%d",t);
if(i!=n) printf(" ");
Delete(root,t);
}
if(T!=0) puts("");
}
return 0;
}