rt,提交记录。
Code (各种卡常可能有点丑):
#include<cstdio>
char buf[1<<21],*p1,*p2,*top, buffer[1<<21];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?0:*p1++)
#define INF 0x7fffffff
#define ls s[0]
#define rs s[1]
using namespace std;
const int N=1e6+5;
namespace OIfast{
inline int read(){
register int n=0;
register char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){
n=(n<<1)+(n<<3)+(c^48);
c=getchar();
}
return n;
}
inline void print(register int n){
register short sta[35];
register short top=0;
do{
sta[top++]=n%10;
n/=10;
}while(n);
while(top)putchar(sta[--top]^48);
return ;
}
inline void write(register int n,register char c){
print(n),putchar(c);
return ;
}
}using namespace OIfast;
namespace splayTree{
int root=0,tot=0;
struct node{
int fa,cnt,size;
int v;
int s[2];
}t[N];
inline void init(register int x,register int _v,register int _fa){
t[x].cnt=t[x].size=1;
t[x].v=_v,t[x].fa=_fa;
return ;
}
inline void pushup(register int x){
t[x].size=t[t[x].ls].size+t[t[x].rs].size+t[x].cnt;
return ;
}
inline void rotate(register int x){
register int y=t[x].fa;
register int z=t[y].fa;
register bool k=(t[y].rs==x);
t[z].s[t[z].rs==y]=x,t[x].fa=z;
t[y].s[k]=t[x].s[k^1],t[t[x].s[k^1]].fa=y;
t[x].s[k^1]=y,t[y].fa=x;
pushup(y),pushup(x);
return ;
}
inline void splay(register int x,register int k){
while(t[x].fa!=k){
register int y=t[x].fa;
register int z=t[y].fa;
if(z!=k){
if((t[y].rs==x)^(t[z].rs==y))rotate(x);
else rotate(y);
}
rotate(x);
}
if(k==0)root=x;
return ;
}
inline void prepare(register int v){
register int u=root;
if(u==0)return ;
while(t[u].s[t[u].v<v]!=0&&t[u].v!=v)u=t[u].s[t[u].v<v];
splay(u,0);
return ;
}
inline void add(register int v){
register int u=root,f=0;
while(u!=0&&t[u].v!=v){
f=u;
u=t[u].s[t[u].v<v];
}
if(u){
++t[u].cnt;
}else{
u=++tot;
init(u,v,f);
if(f!=0){
t[f].s[t[f].v<v]=u;
}
}
splay(u,0);
return ;
}
inline int get(register int v,register int f){
prepare(v);
register int u=root;
if(v<t[u].v&&f)return u;
if(t[u].v<v&&(!f))return u;
if(t[u].s[f]!=0){
u=t[u].s[f];
while(t[u].s[f^1]!=0){
u=t[u].s[f^1];
}
}
return u;
}
inline void del(register int v){
register int a=get(v,0),b=get(v,1);
splay(a,0),splay(b,a);
if(t[t[b].ls].cnt>1){
--t[t[b].ls].cnt;
splay(t[b].ls,0);
}else{
t[b].ls=0;
}
return ;
}
inline int rk(register int v){
prepare(v);
return t[t[root].ls].size;
}
inline int kth(register int k){
register int u=root;
if(t[u].size<k)return -1;
while(1){
if(k>t[t[u].ls].size+t[u].cnt){
k-=t[t[u].ls].size+t[u].cnt,u=t[u].rs;
}else{
if(t[t[u].ls].size>=k)u=t[u].ls;
else return splay(u,0),t[u].v;
}
}
return 0;
}
}using namespace splayTree;
int last,sum;
inline void work(){
register short opt=read();
register int x=read()^last;
if(opt==0)return ;
else if(opt==1){
add(x);
}else if(opt==2){
del(x);
}else if(opt==3){
add(x);
last=rk(x);
del(x);
}else if(opt==4){
last=kth(x+1);
}else if(opt==5){
last=t[get(x,0)].v;
}else if(opt==6){
last=t[get(x,1)].v;
}
if(opt>=3&&opt<=6)sum^=last;
return ;
}
signed main(){
add(-INF),add(INF);
register int n=read(),m=read();
while(n--)add(read());
while(m--)work();
write(sum,'\n');
return 0;
}