Treap 0pts求助
查看原帖
Treap 0pts求助
499231
Jacky2009楼主2022/5/28 22:42
#include<bits/stdc++.h>
using namespace std;
int tot;
#define inf 0x7fffffff
unsigned int seed=114514;
int root;
struct point{
	int l;
	int r,val,v,siz,cnt;
}a[1500005];
int cr(int val){
	tot++;
	a[tot].val=val;
	a[tot].v=rand();
	a[tot].siz=a[tot].cnt=1;
	return tot;
}
void update(int p){
	a[p].siz=a[a[p].l].siz+a[a[p].r].siz+a[p].cnt;
}
int rank(int rk,int p){
	if(!p)return inf;
	
	if(rk<=(a[a[p].l].siz))return rank(rk,a[p].l);
	if(rk<=(a[a[p].l].siz)+a[p].cnt)return a[p].val;
	return rank(rk-a[a[p].l].siz-a[p].cnt,a[p].r);
}
int grank(int x,int p){
	if(!p)return 0;
	if(x==a[p].val)return a[a[p].l].siz+1;
	if(x<a[p].val){
		return grank(x,a[p].l);
	}
	return grank(x,a[p].r)+a[p].cnt+a[a[p].l].siz;
}
void zig(int &p){
	int q=a[p].l;
	a[p].l=a[q].r;
	a[q].r=p;
	p=q;
	update(a[p].r);
	update(p);
}
void zag(int &p){
	int q=a[p].r;
	a[p].r=a[q].l;
	a[q].l=p;
	p=q;
	update(a[p].l);
	update(p);
}
void Insert(int val,int &p){
	if(p==0){
		p=cr(val);
		return;
	}
	if(val==a[p].val){
		a[p].cnt++;
		update(p);
		return;
	}
	if(val<a[p].val){
		Insert(val,a[p].l);
		if(a[p].v<a[a[p].l].v)zig(p);
		
	}
	
	if(val>a[p].val){
		Insert(val,a[p].r);
		if(a[p].v<a[a[p].r].v)zag(p);
		
	}
	update(p);
}
void del(int &p,int x){
	if(!p)return;
	if(x==a[p].val){
		if(a[p].cnt>1){
			a[p].cnt--;
			update(p);
			return;
		}
		if(a[p].l||a[p].r){
			if(a[p].r==0||a[a[p].l].v>a[a[p].r].v){
				zig(p);
				del(a[p].r,x);
			}
			
			else{
				zag(p);
				del(a[p].l,x);
			}
			update(p);
		}
		else p=0;
		return;
	}
	x<a[p].val?del(a[p].l,x):del(a[p].r,x);
	update(p);
}
int getpre(int x){
	int ans=1;
int	p=root;
	while(p){
		if(x==a[p].val){
			if(a[p].l>0){
				p=a[p].l;
				while(a[p].r>0)p=a[p].r;
				ans=p;
			}
			break;
		}
		if(a[p].val<x&&a[p].val>a[ans].val)ans=p;
		p=x<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
int getn(int x){
	int ans=2;
int p=root;
	while(p){
		if(x==a[p].val){
			if(a[p].r>0){
				p=a[p].r;
				while(a[p].l>0)p=a[p].l;
				ans=p;
			}
			break;
		}
		if(a[p].val>x&&a[p].val<a[ans].val)ans=p;
		p=x<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	srand(seed);
//	cout<<rand()<<endl<<rand()<<endl;
	cr(-inf);
	cr(inf);
 root=1;
	a[1].r=2;
	update(root);
	int n,m,lastans=0,k;
	scanf("%d",&n);
	int res=0;
//	bl1(root);
//	cout<<endl;
//	bl(root);
//	cout<<endl<<root<<endl;
	for(int i=1;i<=m;i++){
		int op,x;
		scanf("%d %d",&op,&x);
		//res^=lastans;
	//	x^=lastans;
	//	cout<<"("<<op<<" "<<x<<")"<<endl;
		if(op==1){
			Insert(x,root);
		//	bl(root);
		//	cout<<endl;
		}
		else if(op==2){
			del(root,x);
		//	bl(root);
		//	cout<<endl;
		}
		else if(op==3){
			cout<<grank(x,root)<<endl;
		}
		else if(op==4){
			cout<<rank(x+1,root)<<endl;
		}
		else if(op==5){
			cout<<getpre(x)<<endl;
		}
		else cout<<getn(x)<<endl;
	//	cout<<"Root="<<root<<" "<<a[root].val<<endl;
	}
//	printf("%d",res);
}
2022/5/28 22:42
加载中...