Prean @ 2020-03-23 23:54:54
#include<iostream>
#include<cstdlib>
#include<cstdio>
class splay{public:int f,data,L,R,Ln,Rn,num;}t[1100005];
int root,n,m,num,top,ans;
inline int hig(int x){x=t[x].R;while(t[x].L)x=t[x].L;return x;}
inline int low(int x){x=t[x].L;while(t[x].R)x=t[x].R;return x;}
inline void Zig(int x)
{
int y=t[x].f;t[y].L=t[x].R;t[y].Ln=t[x].Rn;
if(t[x].R)t[t[x].R].f=y;t[x].f=t[y].f;
if(t[y].f)if(t[t[y].f].L==y)t[t[y].f].L=x;
else t[t[y].f].R=x;t[x].R=y;t[y].f=x;
t[x].Rn+=t[y].Rn+t[y].num;
}
inline void Zag(int x)
{
int y=t[x].f;t[y].R=t[x].L;t[y].Rn=t[x].Ln;
if(t[x].L)t[t[x].L].f=y;t[x].f=t[y].f;
if(t[y].f)if(t[t[y].f].L==y)t[t[y].f].L=x;
else t[t[y].f].R=x;t[x].L=y;t[y].f=x;
t[x].Ln+=t[y].Ln+t[y].num;
}
inline void Splay(int x)
{
int p=x;
while(t[x].f)
{
p=t[x].f;
if(!t[p].f){if(x==t[p].L)Zig(x);else Zag(x);break;}
else if(t[p].L==x)if(t[t[p].f].L==p)Zig(p),Zig(x);
else Zig(x),Zag(x);
else if(t[t[p].f].L==p)Zag(x),Zig(x);
else Zag(p),Zag(x);
}root=x;
}
inline void Insert(int k)
{
int f,p=root;
while(p)
{
f=p;if(t[p].data==k){++t[p].num;Splay(p);return;}
if(t[p].data>k)++t[p].Ln,p=t[p].L;else ++t[p].Rn,p=t[p].R;
}t[++top].data=k;t[top].num=1;if(!root){root=top;return;}
if(t[f].data>k)t[f].L=top;else t[f].R=top;t[top].f=f;Splay(top);
}
inline void Delete(int x)
{
int p=root;
while(p)if(t[p].data==x){Splay(p);break;}
else if(t[p].data>x)p=t[p].L;else p=t[p].R;if(--t[p].num)return;
int L=t[p].L,R=t[p].R;if(!L&&!R){root=0;return;}
if(!L){root=R;t[R].f=0;return;}if(!R){root=L;t[L].f=0;return;}
p=low(p);Splay(p);t[p].R=R;t[R].f=p;
t[p].Rn=t[R].Ln+t[R].Rn+t[R].num;
}
inline int read()
{
int x;char s=getchar();while(!isdigit(s))s=getchar();x=s-'0';
while(s=getchar(),isdigit(s))x=(x<<1)+(x<<3)+s-'0';return x;
}
int main()
{
int f,k,q,last=0;n=read();m=read();while(n--)Insert(read());
while(m--)
{
int p,f;f=read();k=read();k^=last;
if(f==1)Insert(k);else if(f==2)Delete(k);
else if(f==3)
{
p=root;int s=0;
while(p)if(t[p].data==k){last=++s+t[p].Ln;break;}
else if(t[p].data<k)s+=t[p].Ln+t[p].num,p=t[p].R;
else p=t[p].L;Splay(p);
}
else if(f==4)
{
p=root;
while(p)if(t[p].num+t[p].Ln>=k&&k>t[p].Ln)
{last=t[p].data;break;}
else if(k>t[p].Ln)k-=(t[p].num+t[p].Ln),p=t[p].R;
else p=t[p].L;Splay(p);
}
else
{
Insert(k);if(f==5)p=low(root);else p=hig(root);
last=t[p].data;Delete(k);
}if(f!=1&&f!=2)ans^=last;
//printf("%d %d %d\n\n",k,last,ans);
}printf("%d",ans);
}
每次检查的时候输出ans,发现求9的后继的时候答案lsat变成了5
by tianxuan @ 2020-03-24 07:51:00
看到Splay直接跑掉