Surget @ 2021-08-21 16:30:12
只过了 #1,#3和#4 其它的是WA和TLE
#include<cstdio>
#include<iostream>
using namespace std;
int n,root,tot,m;
int last=0,ans=0;
struct str
{
int son[2],cnt,f,value,size;
}t[1919810];
void rotate(int x)
{
int fa=t[x].f,gfa=t[fa].f;
int k=(t[fa].son[1]==x)?1:0;
t[gfa].son[t[gfa].son[1]==fa?1:0]=x;
t[x].f=gfa;
t[fa].son[k]=t[x].son[k^1];
t[t[x].son[k^1]].f=fa;
t[x].son[k^1]=fa;
t[fa].f=x;
t[fa].size=t[t[fa].son[1]].size+t[t[fa].son[0]].size+t[fa].cnt;
t[x].size=t[t[x].son[1]].size+t[t[x].son[0]].size+t[x].cnt;
}
void splay(int x,int r)
{
while(t[x].f!=r)
{
int fa=t[x].f,gfa=t[fa].f;
if(gfa!=r)
(t[gfa].son[0]==fa)^(t[fa].son[0]==x)?rotate(x):rotate(fa);
rotate(x);
}
if(r==0) root=x;
}
void find(int x)
{
int k=root;
if(!k) return;
while(t[k].son[x>t[k].value?1:0]&&x!=t[k].value)
k=t[k].son[x>t[k].value?1:0];
splay(k,0);
}
void insert(int x)
{
int k=root,fa=0;
while(k&&t[k].value!=x)
{
fa=k;
k=t[k].son[x>t[k].value?1:0];
}
if(k) t[k].cnt++;
else
{
k=++tot;
if(fa) t[fa].son[x>t[fa].value?1:0]=tot;
t[tot].son[0]=t[tot].son[1]=0;
t[tot].f=fa;
t[tot].value=x;
t[tot].cnt=1;
t[tot].size=1;
}
splay(k,0);
}
int next(int x,int s)
{
find(x);
int k=root;
if(t[k].value>x&&s) return k;
if(t[k].value<x&&!s) return k;
k=t[k].son[s];
while(t[k].son[s^1]) k=t[k].son[s^1];
return k;
}
void del(int x)
{
int la=next(x,0),ne=next(x,1);
splay(la,0),splay(ne,la);
int k=t[ne].son[0];
if(t[k].cnt>1)
{
t[k].cnt--;
splay(k,0);
}
else t[ne].son[0]=0;
}
int query(int x)
{
int k=root;
if(t[k].size<x) return 0;
while(1)
{
int lson=t[k].son[0],rson=t[k].son[1],sum=t[lson].size+t[k].cnt;
if(x>sum)
{
x-=sum;
k=rson;
}
else
{
if(t[lson].size>=x) k=lson;
else
{
splay(k,0);
return t[k].value;
}
}
}
}
signed main()
{
scanf("%d%d",&n,&m);
insert(0x7fffffff);
insert(-0x7fffffff);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
insert(x);
}
while(m--)
{
int opt,x;
scanf("%d%d",&opt,&x);
x^=last;
if(opt==1) insert(x);
if(opt==2) del(x);
if(opt==3)
{
find(x);
last=t[t[root].son[0]].size+1;
ans^=last;
}
if(opt==4) last=query(x+1),ans^=last;
if(opt==5) last=t[next(x,0)].value,ans^=last;
if(opt==6) last=t[next(x,1)].value,ans^=last;
}
printf("%d",ans);
return 0;
}
求助/kk
by ppip @ 2021-08-29 19:47:50
@Surget Cu Ball