Treap 样例不过求调
查看原帖
Treap 样例不过求调
933802
ICU152_lowa_IS8楼主2024/8/2 22:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int siz[1000005],cnt[1000005],val[1000005],dat[1000005];
int ch[1000005][2];
int tot,root;
inline int New(int v){
	cnt[++tot]=1;
	siz[tot]=1;
	val[tot]=v;
	dat[tot]=rand();
	return tot;
}
inline void pushup(int id){
	siz[id]=siz[ch[id][0]]+siz[ch[id][1]]+cnt[id];
}
inline void build(){
	root=New(-0x3f3f3f3f3f3f3f3f);
	ch[root][1]=New(0x3f3f3f3f3f3f3f3f);
	pushup(root);
}
inline void Rotate(int &id,int d){
	int temp=ch[id][d^1];
	ch[id][d^1]=ch[temp][d];
	ch[temp][d]=id;
	id=temp;
	pushup(ch[id][d]);
	pushup(id);
}
inline void insert(int &id,int v){
	if(!id){
		id=New(v);
		return;
	}
	if(val[id]==v){
		cnt[id]++;
	}
	else{
		int d=v<val[id]?0:1;
		insert(ch[id][d],v);
		if(dat[id]<dat[ch[id][d]]){
			Rotate(id,d^1);
		}
	}
	pushup(id);
}
inline void del(int &id,int v){
	if(!id)return;
	if(val[id]==v){
		if(cnt[id]>1){
			cnt[id]--;
		}
		else if(ch[id][0]||ch[id][1]){
			if(!ch[id][1]||dat[ch[id][0]]>dat[ch[id][1]]){
				Rotate(id,1);
				del(ch[id][1],v);
			}
			else{
				Rotate(id,0);
				del(ch[id][0],v);
			}
		}
		else{
			id=0;
			return;
		}
	}
	else{
		int d=v<val[id]?0:1;
		del(ch[id][d],v);
	}
	pushup(id);
}
inline int getrank(int id,int v){
	if(!id)return 1;
	if(v==val[id])return siz[ch[id][0]]+1;
	if(v<val[id])return getrank(ch[id][0],v);
	if(v>val[id])return getrank(ch[id][1],v)+siz[ch[id][0]]+cnt[id];
}
inline int getnum(int id,int rank){
	if(!id){
//	cout<<"SDFJKLFSD\n"; 
	return 0x3f3f3f3f3f3f3f3f;
		
	}
	if(rank<=siz[ch[id][0]])return getnum(ch[id][0],rank);
	else if(rank<=siz[ch[id][0]]+cnt[id])return val[id];
	else return getnum(ch[id][1],rank-siz[ch[id][0]]-cnt[id]);
}
inline int getpre(int v){
	int id=root,pre;
	while(id){
		if(val[id]<v){
			pre=val[id];
			id=ch[id][1];
		}
		else{
			id=ch[id][0];
		}
	}
	return pre;
}
inline int getnext(int v){
	int id=root,next;
	while(id){
		if(val[id]>v){
			next=val[id];
			id=ch[id][0];
		}
		else{
			id=ch[id][1];
		}
	}
	return next;
}
signed main(){
	ios::sync_with_stdio(false);
	srand(time(NULL));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		insert(root,x);
	}
	int last=0,ans=0;
	while(m--){
		int op,x;
		cin>>op>>x;
		x^=last;
//		cout<<op<<" "<<x<<" "<<last<<"|\n";
		int tt=-1;
		if(op==1){
			insert(root,x);
		}
		else if(op==2){
			del(root,x);
		}
		else if(op==3){
			tt=getrank(root,x)-1;
		}
		else if(op==4){
			tt=getnum(root,x+1);
		}
		else if(op==5){
			tt=getpre(x);
		}
		else{
			tt=getnext(x);
		}
		if(tt!=-1)ans^=tt;
		if(tt!=-1)last=tt;
	}
	cout<<ans;
	return 0;
}
2024/8/2 22:47
加载中...