fhqtreap WA 40pts求助
查看原帖
fhqtreap WA 40pts求助
352426
就决定是你辣楼主2022/11/15 11:08

rt,已通过未加强版

#include<bits/stdc++.h>
using namespace std;
std::mt19937 rnd(233);
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int maxn=2000000;
struct node{
	int l,r;
	int val,key;
	int size;
}fhq[maxn];
int cnt,root;
int newnode(int val){
	fhq[++cnt].val=val;
	fhq[cnt].key=rnd();
	fhq[cnt].size=1;
	return cnt;
}
void update(int now){
	fhq[now].size=fhq[fhq[now].l].size+fhq[fhq[now].r].size+1;
}
void split(int now,int val,int &x,int &y){
	if(!now)x=y=0;
	else {
		if(fhq[now].val<=val){
			x=now;
			split(fhq[now].r,val,fhq[now].r,y);
		}
		else{
			y=now;
			split(fhq[now].l,val,x,fhq[now].l);
		}
		update(now);
	}
	
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(fhq[x].key>fhq[y].key){
		fhq[x].r=merge(fhq[x].r,y);
		update(x);
		return x;
	}
	else {
		fhq[y].l=merge(x,fhq[y].l);
		update(y);
		return y;
	}
}
int x,y,z;
inline void ins(int val){
	split(root,val,x,y);
	root=merge(merge(x,newnode(val)),y);
}
inline void del(int val){
	split(root,val,x,z);
	split(x,val-1,x,y);
	y=merge(fhq[y].l,fhq[y].r);
	root=merge(merge(x,y),z);
}
inline int getrank(int val){
	split(root,val-1,x,y);
	return fhq[x].size+1;
	root=merge(x,y);
}
inline int getnum(int rank){
	int now=root;
	
	while(now){
		//213<<.size;
		if(fhq[fhq[now].l].size+1==rank)
			break;
		else if(fhq[fhq[now].l].size>=rank)
			now=fhq[now].l;
		else {
			rank-=fhq[fhq[now].l].size+1;
			now=fhq[now].r;
		}
	}
	return fhq[now].val;
}
inline int pre(int val){
	split(root,val-1,x,y);
	int now=x;
	while(fhq[now].r)
		now=fhq[now].r;
	return fhq[now].val;
	root=merge(x,y);
}
inline int nxt(int val){
	split(root,val,x,y);
	int now=y;
	while(fhq[now].l)
		now=fhq[now].l;
	return fhq[now].val;
	root=merge(x,y);
}
int main(){
		int n=read(),m=read();
	for(int i=1;i<=n;i++){
		ins(read());
	}
	int lst=0;
	int ans=0;
	for(int i=1;i<=m;i++){
		int opt=read(),val=read()^lst;
		if(opt==1)ins(val);
		else if(opt==2)del(val);
		else if(opt==3){
			ins(val);
			lst=getrank(val);
			del(val);
		}
		else if(opt==4)lst=getnum(val);
		else if(opt==5)lst=pre(val);
		else if(opt==6)lst=nxt(val);
		if(opt>2)ans^=lst;
		//cout<<val<<endl;
	} 
	cout<<ans<<endl;
}
2022/11/15 11:08
加载中...