因此我来灌水区找人帮我调 P6136 【模板】普通平衡树(数据加强版)的splay做法qwq
96pts TLE on #11
#include<bits/stdc++.h>
using namespace std;
#define int long long int
int n,m,lst,ans;
struct tree
{
int son[2],fa,val,cnt,siz;
}t[1200005];
int sum,root;
inline void push_up(int num)
{
t[num].siz=t[t[num].son[0]].siz+t[t[num].son[1]].siz+t[num].cnt;
return ;
}
inline void rotate(int x)
{
register int y=t[x].fa,z=t[y].fa;
register int k=(t[y].son[1]==x);
t[z].son[(t[z].son[1]==y)]=x,t[x].fa=z;
t[y].son[k]=t[x].son[k^1],t[t[x].son[k^1]].fa=y;
t[x].son[k^1]=y,t[y].fa=x;
push_up(y),push_up(x);
return ;
}
inline void splay(int x,int k)
{
while(t[x].fa!=k)
{
register int y=t[x].fa,z=t[y].fa;
if(z!=k)(t[y].son[0]==x&&t[z].son[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(k^1)root=x;
return ;
}
inline void find(int x)
{
register int nrt=root;
while(t[nrt].son[(x>t[nrt].val)]&&x!=t[nrt].val)
nrt=t[nrt].son[(x>t[nrt].val)];
splay(nrt,0);
return ;
}
inline int np(int x,int k)
{
find(x);
register int nrt=root;
if((t[nrt].val<x&&!k)||(t[nrt].val>x&&k))return nrt;
nrt=t[nrt].son[k];
while(t[nrt].son[k^1])nrt=t[nrt].son[k^1];
splay(nrt,0);
return nrt;
}
inline void insert(int x)
{
register int nrt=root,fx=0;
while(nrt&&t[nrt].val!=x)
fx=nrt,nrt=t[nrt].son[(x>t[nrt].val)];
if(nrt)t[nrt].cnt++,splay(nrt,0);
else
{
sum++,t[sum].cnt=t[sum].siz=1;
if(fx)t[fx].son[(x>t[fx].val)]=sum;
t[sum].val=x,t[sum].fa=fx,splay(sum,0);
}
return ;
}
inline void delet(int x)
{
register int y=np(x,0),z=np(x,1);
splay(y,0),splay(z,y);
if(t[t[z].son[0]].cnt>1)
t[t[z].son[0]].cnt--,splay(t[z].son[0],0);
else t[z].son[0]=0,splay(z,0);
return ;
}
inline void ranknum(int x)
{
insert(x),find(x);
lst=t[t[root].son[0]].siz;
delet(x),ans^=lst;
return ;
}
inline int data(int x)
{
register int nrt=root;
while(1)
{
if(x>t[t[nrt].son[0]].siz+t[nrt].cnt)
x-=t[t[nrt].son[0]].siz+t[nrt].cnt,nrt=t[nrt].son[1];
else if(t[t[nrt].son[0]].siz>=x)nrt=t[nrt].son[0];
else {splay(nrt,0);return t[nrt].val;}
}
}
inline int read()
{
register int x=0,f=1;
register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
n=read(),m=read();
insert(-1e17),insert(1e17);
for(register int i=1,x;i<=n;i++)
x=read(),insert(x);
for(register int i=1,opt,x;i<=m;i++)
{
opt=read(),x=read(),x^=lst;
if(opt==1)insert(x);
else if(opt==2)delet(x);
else if(opt==3)ranknum(x);
else if(opt==4)lst=data(x+1),ans^=lst;
else if(opt==5)lst=t[np(x,0)].val,ans^=lst;
else if(opt==6)lst=t[np(x,1)].val,ans^=lst;
}
cout<<ans<<endl;
return 0;
}
@skella_ 救救我四个也拉先生!