记录编号 456872 评测结果 AAAAAAAAAAAA
题目名称 2630. 璐璐的治疗 最终得分 100
用户昵称 하루Kiev 是否通过 通过
代码语言 C++ 运行时间 2.338 s
提交时间 2017-10-05 20:10:45 内存使用 0.77 MiB
显示代码纯文本
# include "iostream"
# include "algorithm"
# include "stdio.h"
# include "string.h"
# include "math.h"
# include "time.h"
# define maxn 10005
using namespace std;
int t,n,m,zz,ai,bi,root,opt;
struct treap{int tot,sz,no,rd,ls,rs;}e[maxn*2];
void lx(int &rt){
	 int t=e[rt].rs;
	 e[rt].rs=e[t].ls;
	 e[t].ls=rt;
	 e[t].sz=e[rt].sz;
	 e[rt].sz=e[e[rt].ls].sz+e[e[rt].rs].sz+e[rt].tot;
	 rt=t;
}
void rx(int &rt){
	 int t=e[rt].ls;
	 e[rt].ls=e[t].rs;
	 e[t].rs=rt;
	 e[t].sz=e[rt].sz;
	 e[rt].sz=e[e[rt].ls].sz+e[e[rt].rs].sz+e[rt].tot;
	 rt=t;
} 
void insert(int &rt,int x){
	 if(!rt){
	 	rt=++zz;
	 	e[rt].no=x;
	 	e[rt].sz=e[rt].tot=1;
	 	e[rt].rd=rand();
	 	return;
	 }e[rt].sz++;
	 if(e[rt].no==x) e[rt].tot++;
	 else{
	 	 if(e[rt].no>x){
	 	 	 insert(e[rt].ls,x);
	 	 	 if(e[e[rt].ls].rd<e[rt].rd)
		        rx(rt);
		 }
		 else{
		 	 insert(e[rt].rs,x);
		 	 if(e[e[rt].rs].rd<e[rt].rd)
		 	    lx(rt);
		 }
	 }
}
void del(int &rt,int x){
	 if(!rt) return;
	 if(e[rt].no==x){
	 	if(e[rt].tot>1){
	 		e[rt].sz--;
	 		e[rt].tot--;
	 		return;
    	}
    	if(e[rt].ls*e[rt].rs==0)
    	   rt=e[rt].ls+e[rt].rs;
    	else{
    		if(e[e[rt].ls].rd<e[e[rt].rs].rd) rx(rt);
    		else lx(rt);
    		del(rt,x);
		}
	 }
	 else{
	 	e[rt].sz--;
	 	if(x>e[rt].no) del(e[rt].rs,x);
	 	else del(e[rt].ls,x);
	 }
}
int num(int &rt,int rk){
	if(!rt) return 0;
	if(e[e[rt].ls].sz+1<=rk&&e[e[rt].ls].sz+e[rt].tot>=rk)
	   return e[rt].no;
	if(e[e[rt].ls].sz>=rk) return num(e[rt].ls,rk);
	if(e[e[rt].ls].sz<rk) return num(e[rt].rs,rk-e[rt].tot-e[e[rt].ls].sz); 
}
int main(){
	freopen("ll.in","r",stdin);
	freopen("ll.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		  root=0;zz=0;
		  memset(e,0,sizeof e);
		  scanf("%d%d",&n,&m);
		  for(int i=1;i<=n;i++) {scanf("%d",&ai);insert(root,ai);}
	      while(m--){
	      	    scanf("%d",&opt);
				  switch(opt){
				  	 case(1):scanf("%d",&ai);del(root,ai);break;
				  	 case(2):scanf("%d",&ai);insert(root,ai);break;
				  	 case(3):scanf("%d%d",&ai,&bi);del(root,ai);insert(root,bi);break;
				  	 case(4):scanf("%d",&ai);printf("%d\n",num(root,ai));
				  } 
		  }
	}
}