52pts 全RE 求助
查看原帖
52pts 全RE 求助
1025380
Fire_Shadow_Dream楼主2025/2/4 16:25
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+90,inf=1e16;
ll n,m,a[N],f[N];
struct node{
	node *ls,*rs;
	ll val,sum_cnt,size,rank;
}tr[N<<2];
node *root,*null=tr+0;
ll tot; 
node *newnode(ll val){
	tot++;
	tr[tot].size=tr[tot].sum_cnt=1,tr[tot].val=val,tr[tot].rank=rand();
	tr[tot].ls=tr[tot].rs=null;
	return tr+tot;
}
void upds(node *&x){
	x->size=x->sum_cnt;
	if(x->ls!=null) x->size+=x->ls->size;
	if(x->rs!=null) x->size+=x->rs->size;
}
void build(){
	node *x=newnode(inf),*y=newnode(-inf);
	if(x->rank<y->rank){
		root=x;
		root->ls=y;
	}
	else{
		root=y;
		root->rs=x;
	}
	upds(root);
}
void zag(node *&x,node *&y){
	node *tmp=x;
	y->ls=tmp->rs;
	tmp->rs=y;
	upds(y),upds(tmp);
	y=tmp;
}
void zig(node *&x,node *&y){
	node *tmp=x;
	y->rs=tmp->ls;
	tmp->ls=y;
	upds(y),upds(tmp);
	y=tmp;
}
void insert(node *&now,ll val){
	if(now==null){
		now=newnode(val);
		return ;
	}
	if(now->val==val){
		now->size++,now->sum_cnt++;
		return ;
	}
	if(now->val>val){
		insert(now->ls,val);
		if(now->rank>now->ls->rank) zag(now->ls,now);
	}
	else{
		insert(now->rs,val);
		if(now->rank>now->rs->rank) zig(now->rs,now);
	}
	upds(now);
	return ;
}
void delet(node *&now,ll val){
	if(now->val==val){
		if(now->sum_cnt>1) now->sum_cnt--,now->size--;
		else{
			bool L=(now->ls!=null),R=(now->rs!=null);
			if((!L)&&(!R)) now=null;
			else if((!L)&&R) now=now->rs;
			else if(L&&(!R)) now=now->ls;
			else{
				bool po=(now->ls->rank<now->rs->rank);
				if(po) zag(now->ls,now);
				else zig(now->rs,now);
				delet((po ? now->rs : now->ls),val);
			}
			upds(now);
		}
		return ;
	}
	if(now->val>val) delet(now->ls,val);
	else delet(now->rs,val);
	upds(now);
	return ;
}
ll sumK(node *now,ll val){
	if(now==null) return 0;
	if(now->val<val) return now->ls->size+now->sum_cnt+sumK(now->rs,val);
	else if(now->val==val) return now->ls->size;
	else return sumK(now->ls,val);
}
ll findK(node *now,ll k){
	if(now->ls->size>=k) return findK(now->ls,k);
	else if(now->ls->size+now->sum_cnt>=k) return now->val;
	else return findK(now->rs,k-now->ls->size-now->sum_cnt);
}
ll prep(node *now,ll val,ll op){
	if(now==null) return op;
	else if(now->val<val) return prep(now->rs,val,now->val);
	else return prep(now->ls,val,op); 
}
ll succ(node *now,ll val,ll op){
	if(now==null) return op;
	else if(now->val>val) return succ(now->ls,val,now->val);
	else return succ(now->rs,val,op); 
}
void dfs(node *now){
	if(now==null) return ;
	cout<<now->val<<" "<<now->ls->val<<" "<<now->rs->val<<" "<<now->sum_cnt<<" "<<now->size<<"\n";
	dfs(now->ls),dfs(now->rs);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	freopen("treap.in","r",stdin),freopen("treap.out","w",stdout);
	srand(0);
	build();
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		ll x;
		cin>>x;
		insert(root,x);
//		dfs(root);
//		cout<<"\n-----\n" ;
	}
	ll ans=0,tans=0;
	for(int i=1;i<=m;i++){
		ll op,x;
		cin>>op>>x;
		x^=ans;
		if(op==1) insert(root,x);
		else if(op==2) delet(root,x);
		else if(op==3) ans=sumK(root,x);
		else if(op==4) ans=findK(root,x+1);
		else if(op==5) ans=prep(root,x,0);
		else ans=succ(root,x,0);
		if(op!=1&&op!=2) tans^=ans;
	} 
	cout<<tans;
	return 0;
}

提交记录

2025/2/4 16:25
加载中...