Splay TLE #10 求调
查看原帖
Splay TLE #10 求调
676520
Liuhy2996楼主2024/8/16 10:23
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10,inf=2e9;
int n,m,op,x,rt,tot,lst,ans,f;
struct Splay{
	int fa,tg,sz,vl,cnt,s[2];
}tr[N];
inline void rd(int &x){
	x=0,f=0;
	char ch=getchar();
	while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
	while(ch<='9'&&ch>='0') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	if(f) x=-x;
}
inline void psu(int x){tr[x].sz=tr[tr[x].s[0]].sz+tr[tr[x].s[1]].sz+tr[x].cnt;}
inline int find(int k){
	int x=rt;
	while(tr[x].vl!=k) x=tr[x].s[tr[x].vl<k];
	return x;
}
inline void rot(int x){
	int y=tr[x].fa,z=tr[y].fa,k=(x==tr[y].s[0]);
	tr[z].s[y==tr[z].s[1]]=x,tr[x].fa=z;
	tr[y].s[!k]=tr[x].s[k],tr[tr[x].s[k]].fa=y;
	tr[x].s[k]=y,tr[y].fa=x;
	psu(y),psu(x);
}
inline void spl(int x,int k){
	while(tr[x].fa!=k){
		int y=tr[x].fa,z=tr[y].fa;
		if(z!=k) rot((tr[y].s[1]==x)^(tr[z].s[1]==y)?x:y);
		rot(x);
	}
	if(!k) rt=x;
}
inline int nw(int x,int fa){
	tr[++tot].vl=x,tr[tot].cnt=tr[tot].sz=1,tr[tot].fa=fa;
	return tot;
}
inline void bld(){
	rt=nw(-inf,0);
	tr[rt].s[1]=nw(inf,1);
	psu(rt);
}
inline void ins(int k){
	int x=rt,fa=0;
	while(x){
		if(tr[x].vl==k) return ++tr[x].cnt,spl(x,0),void();
		fa=x,x=tr[x].s[tr[x].vl<k];
	}
	tr[fa].s[tr[fa].vl<k]=x=nw(k,fa),spl(x,0);
}
inline int kth(int x,int k){
	if(tr[tr[x].s[0]].sz>=k) return kth(tr[x].s[0],k);
	if(k-tr[tr[x].s[0]].sz<=tr[x].cnt) return tr[x].vl;
	return kth(tr[x].s[1],k-tr[tr[x].s[0]].sz-tr[x].cnt);
}
inline int rnk(int k){
	spl(find(k),0);
	return tr[tr[rt].s[0]].sz;
}
inline int pre(int x){
	spl(find(x),0),x=tr[rt].s[0];
	while(tr[x].s[1]) x=tr[x].s[1];
	return x;
}
inline int nxt(int x){
	spl(find(x),0),x=tr[rt].s[1];
	while(tr[x].s[0]) x=tr[x].s[0];
	return x;
}
inline void del(int k){
	int pv=pre(k),nt=nxt(k);
	spl(pv,0),spl(nt,rt);
	int x=tr[tr[rt].s[1]].s[0];
	if(tr[x].cnt>1) --tr[x].cnt,psu(x);
	else tr[tr[rt].s[1]].s[0]=0;
	psu(tr[rt].s[1]),psu(rt);
}
int main(){
	bld();
	cin>>n>>m;
	while(n--) rd(x),ins(x);
	while(m--){
		rd(op),rd(x); x^=lst;
		if(op==1) ins(x);
		else if(op==2) del(x);
		else{
			if(op==3) ins(x),lst=rnk(x),del(x);
			else if(op==4) lst=kth(rt,x+1);
			else if(op==5) ins(x),lst=tr[pre(x)].vl,del(x);
			else ins(x),lst=tr[nxt(x)].vl,del(x);
			ans^=lst;
		}
	}
	cout<<ans;
	return 0;
}
2024/8/16 10:23
加载中...