| #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,size,root,ans; struct node{ 	int l,r,v,size,rnd,w; }tr[200005]; inline int update(int k) { 	tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } inline int rturn(int &k) { 	int t=tr[k].l; 	tr[k].l=tr[t].r; 	tr[t].r=k; 	tr[t].size=tr[k].size; 	update(k); 	k=t; } inline int lturn(int &k) { 	int t=tr[k].r; 	tr[k].r=tr[t].l; 	tr[t].l=k; 	tr[t].size=tr[k].size; 	update(k); 	k=t; } inline void insert(int &k,int x) { 	if(!k) 	{ 		size++; 		k=size; 		tr[k].w=tr[k].size=1; 		tr[k].rnd=rand(); 		tr[k].v=x; 		return ; 	} 	tr[k].size++; 	if(tr[k].v==x) tr[k].w++; 	else  	{ 		if(tr[k].v<x) 		{ 			insert(tr[k].r,x); 			if(tr[k].rnd>tr[tr[k].r].rnd) lturn(k); 		} 		else 		{ 			insert(tr[k].l,x); 			if(tr[k].rnd>tr[tr[k].l].rnd) rturn(k); 		} 	}	 } inline void del(int &k,int x) { 	if(!k) return ; 	if(tr[k].v==x) 	{ 		if(tr[k].w>1) 		{ 			tr[k].size--; 			tr[k].w--; 			return ; 		} 		else 		{ 			if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r; 			else 				if(tr[tr[k].l].rnd>tr[tr[k].r].rnd) 				{ 					lturn(k);  					del(k,x); 				} 				else 				{ 					rturn(k);  					del(k,x); 				} 		} 	} 	else 		if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); 		else tr[k].size--,del(tr[k].l,x); } inline int find(int k,int x) { 	if(k==0) return 0; 	if(tr[k].v==x) return tr[tr[k].l].size+1; 	else 		if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+find(tr[k].r,x); 		else return find(tr[k].l,x); } inline int num(int k,int x) { 	if(k==0) return 0; 	if(x<=tr[tr[k].l].size) 		return num(tr[k].l,x); 	else  		if(x>tr[tr[k].l].size+tr[k].w) 		return num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); 		else return tr[k].v; } inline int pro(int k,int x) { 	if(k==0) return 0; 	if(tr[k].v<x) 	{ 		ans=k; 		pro(tr[k].r,x); 	} 	else pro(tr[k].l,x); } inline int succ(int k,int x) { 	if(k==0) return 0; 	if(tr[k].v>x) 	{ 		ans=k; 		succ(tr[k].l,x); 	} 	else succ(tr[k].r,x); } int main() { 	scanf("%d",&n); 	int x,a; 	while(n--) 	{         scanf("%d%d",&a,&x); 		if(a==1) insert(root,x); 		if(a==2) del(root,x); 		if(a==3) printf("%d\n",find(root,x)); 		if(a==4) printf("%d\n",num(root,x)); 		if(a==5) pro(root,x),printf("%d\n",tr[ans].v); 		if(a==6) succ(root,x),printf("%d\n",tr[ans].v);	 	} 	return 0; }
 |