救救孩子吧fhq
查看原帖
救救孩子吧fhq
138357
Richard21477楼主2020/7/15 22:52
#include<bits/stdc++.h>
using namespace std;
struct node{
	int l;
	int r;
	int num;
	int key;
	int s;
};
node all[100000];
int root;
int cnt=1;
int nes(int x){//return loc
	all[cnt].l=all[cnt].r=0;
	all[cnt].s=1;
	all[cnt].num=x;
	all[cnt].key=rand();
	cnt++;
	return cnt-1;
}
void update(int loc){
	all[loc].s=all[all[loc].l].s+all[all[loc].r].s;
	return;
}
void split(int loc,int val,int &x,int &y){//from <=val;x->l's r;y->r's l;also root
	if (loc==0){
		x=y=0;
		return;
	}
	if (val>=all[loc].num){
		x=loc;
		split(all[loc].r,val,all[loc].r,y);
	}
	else{
		y=loc;
		split(all[loc].l,val,x,all[loc].l);
	}
	update(loc);
}
int merge(int le,int ri){//le << ri,return root
	if (le==0||ri==0)
		return le+ri;//l or r
	if (all[le].key<all[ri].key){
		all[ri].l=merge(le,all[ri].l);
		update(ri);
		return ri;
	}
	else{
		all[le].r=merge(all[le].r,ri);
		update(le);
		return le;
	}
}
int x,y,z;
void ins(int val){
	split(root,val,x,y);
	root=merge(merge(x,nes(val)),y);
}
void del(int val){
	split(root,val,x,z);
	split(x,val,x,y);
	y=merge(all[y].l,all[y].r);
	root=merge(merge(x,y),z);
	return;
}
int askrank(int val){
	split(root,val-1,x,y);
	int ret=all[x].s;
	root=merge(x,y);
	return ret;
}
int asknum(int rk){
	int f=root;
	while (f!=0){
		if (all[all[f].l].s+1==rk)
			break;
		if (all[all[f].l].s+1<rk)
			f=all[f].l;
		else{
			rk-=all[all[f].l].s+1;
			f=all[f].r;
		}
	}
	return all[f].num;
}
int bef(int val){
	split(root,val-1,x,y);
	int f=x;
	while (all[f].r!=0){
		f=all[f].r;
	}
	int ret=all[f].num;
	root=merge(x,y);
	return ret;
}
int aft(int val){
	split(root,val,x,y);
	int f=y;
	while (all[f].l!=0){
		f=all[f].l;
	}
	int ret=all[f].num;
	root=merge(x,y);
	return ret;
}
int main(){
	srand(time(0));
	int n;
	cin>>n;
	for (int i=0;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		switch(a){
			case 1:
				ins(b);
				break;
			case 2:
				del(b);
				break;
			case 3:
				printf("%d\n",askrank(b));
				break;
			case 4:
				printf("%d\n",asknum(b));
				break;
			case 5:
				printf("%d\n",bef(b));
				break;
			default:
				printf("%d\n",aft(b));
				break;
		}
	}
	return 0;
}
2020/7/15 22:52
加载中...