Treap求条 52分
查看原帖
Treap求条 52分
1293987
zhangruixiang楼主2025/2/6 13:43

玄关

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+10;
int root=0,k;
struct treap{
	int ls,rs;
	int val,pri;
	int cnt,size;
}t[MAXN];
void up(int id){t[id].size=t[t[id].ls].size+t[t[id].rs].size+t[id].cnt;}
void zag(int &rt){
	int b=t[rt].rs;
	t[rt].rs=t[b].ls;
	t[b].ls=rt;
	up(rt);up(b);
	rt=b;
}
void zig(int &rt){
	int b=t[rt].ls;
	t[rt].ls=t[b].rs;
	t[b].rs=rt;
	up(rt);up(b);
	rt=b;
}
void insert(int &rt,int x){
	if(rt==0){
		t[++k].val=x;
		t[k].cnt=t[k].size=1;
		t[k].pri=rand()%1145140;
		rt=k;
		return;
	}
	t[rt].size++;
	if(x==t[rt].val){
		t[rt].cnt++;
		return;
	}
	if(x<t[rt].val){
		insert(t[rt].ls,x);
		if(t[t[rt].ls].pri<t[rt].pri)zig(rt);
	}
	else{
		insert(t[rt].rs,x);
		if(t[t[rt].rs].pri<t[rt].pri)zag(rt);
	}
}
void del(int &rt,int x){
	if(rt==0)return;
	if(t[rt].val==x){
		if(t[rt].cnt>1){
			t[rt].cnt--;
			t[rt].size--;
			return;
		}
		if(t[rt].ls==0||t[rt].rs==0){
			rt=t[rt].ls+t[rt].rs;
		}
		else{
			if(t[t[rt].ls].pri<t[rt].pri){
				zig(rt);del(rt,x);
			}
			else{
				zag(rt);del(rt,x);	
			}
		}
	}
	else if(x<t[rt].val){
		t[rt].size--;del(t[rt].ls,x);
	}
	else {
		t[rt].size--;del(t[rt].rs,x);
	}
}
int fRank(int rt,int x){
	if(rt==0)return 1;
	if(x==t[rt].val)return t[t[rt].ls].size+1;
	if(t[rt].val<x)return t[t[rt].ls].size+t[rt].cnt+fRank(t[rt].rs,x);
	else return fRank(t[rt].ls,x);
}
int fVal(int rt,int x){
	if(rt==0)return 0;
	if(t[t[rt].ls].size>=x)return fVal(t[rt].ls,x);
	else if(t[t[rt].ls].size+t[rt].cnt<x)return fVal(t[rt].rs,x-t[t[rt].ls].size-t[rt].cnt);
	else return t[rt].val;
}
const int INF=-0x7f7f7f7f;
int fPre(int rt,int x){
	if(rt==0)return -INF;
	if(t[rt].val<x)return max(t[rt].val,fPre(t[rt].rs,x));
	else return fPre(t[rt].ls,x);
}
int fNext(int rt,int x){
	if(rt==0)return INF;
	if(t[rt].val>x)return min(t[rt].val,fNext(t[rt].ls,x));
	else return fNext(t[rt].rs,x);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	srand(time(NULL));
	memset(t,0,sizeof(t));
	int m,n,opt,v,xx,ans=0,last=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>v;
		insert(root,v);
	}
	while(m--){
		cin>>opt>>xx;
		int x=xx^last;
		if(opt==1)insert(root,x);
		if(opt==2)del(root,x);
		if(opt==3){last=fRank(root,x);ans=ans^last;}
		if(opt==4){last=fVal(root,x);ans=ans^last;}
		if(opt==5){last=fPre(root,x);ans=ans^last;}
		if(opt==6){last=fNext(root,x);ans=ans^last;}
		//cout<<ans<<endl;
	}
	cout<<ans;
	return 0;
}
2025/2/6 13:43
加载中...