WA 6个测试点, TLE 3个测试点,有没有大神帮忙看看,自己看了半天了……
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
template <typename T> inline void read(T& res)
{
int f=1;res=0;char ch=getchar();
while(ch<'0' or ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' and ch<='9'){res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
res*=f;
}
template <typename T,typename... Args>inline void read(T& t,Args&... args)
{
read(t);read(args...);
}
void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
}
using namespace IO;
const int N=1e5+1e6+20;
#define il inline
struct splayy
{
int v;//节点权值
int cnt;//节点数量
int size;//子树+自身节点大小
int s[2];//两个儿子
int p;//父节点
il void init(int _p,int _v)
{
v=_v,p=_p;cnt=1;
}
}a[N];
int idx,root,inf=0x7fffffff-5;
il void pushup(int x)
{
a[x].size=a[a[x].s[0]].size+a[a[x].s[1]].size+a[x].cnt;
}
il void rotate(int x)
{
int y=a[x].p,z=a[y].p;
int k= a[y].s[1]==x;
a[z].s[a[z].s[1]==y]=x,a[x].p=z;
a[y].s[k]=a[x].s[k^1],a[a[x].s[k^1]].p=y;
a[x].s[k^1]=y,a[y].p=x;
pushup(y),pushup(x);
}
il void splay(int x,int k)
{
while(a[x].p!=k)
{
int y=a[x].p,z=a[y].p;
if(z!=k)
{
if((a[y].s[0]==x) ^ (a[z].s[0]==y))rotate(x);//折线形
else rotate(y);
}
rotate(x);
}
if(k==0)root=x;
}
il void find(int v)//找到元素v,并将该节点转到根
{
int x=root;
while(a[x].v!=v and a[x].s[v>a[x].v])
{
x=a[x].s[v>a[x].v];
}
splay(x,0);
}
il int get_pre(int v)
{
find(v);
int x=root;
if(a[x].v<v)return x;
x=a[x].s[0];
while(a[x].s[1])x=a[x].s[1];
splay(x,0);
return x;
}
il int get_suf(int v)
{
find(v);
int x=root;
if(a[x].v>v)return x;
x=a[x].s[1];
while(a[x].s[0])x=a[x].s[0];
splay(x,0);
return x;
}
il void insert(int v)
{
int x=root,p=0;
while(x and a[x].v!=v)
{
p=x;x=a[x].s[v>a[x].v];
}
if(x)++a[x].cnt;
else
{
x=++idx;
a[p].s[v>a[p].v]=x;
a[x].init(p,v);
}
splay(x,0);
}
il void del(int v)
{
int pre=get_pre(v);
int suf=get_suf(v);
splay(pre,0);splay(suf,pre);
int del=a[suf].s[0];
if(a[del].cnt>1)
{
--a[del].cnt;splay(del,0);
}
else
{
a[suf].s[0]=0;splay(suf,0);
}
}
il int get_rank(int v)//查询v 的排名
{
insert(v);
int res=a[a[root].s[0]].size;
del(v);
return res;
}
il int get_val(int k)//查询排名为k的数
{
int x=root;
while(1)
{
int y=a[x].s[0];
if(a[y].size+a[x].cnt<k)
{
k-=a[y].size+a[x].cnt;
x=a[x].s[1];
}
else
{
if(a[y].size>=k)x=a[x].s[0];
else break;
}
}
splay(x,0);
return a[x].v;
}
int n,opt,x,m,last,ans;
signed main()
{
insert(-inf);insert(inf);root=1;
read(m,n);
while(m--)
{
read(x);insert(x);
}
while(n--)
{
read(opt,x);
if(opt==1)insert(x);
else if(opt==2)del(x);
if(opt==1 or opt==2)continue;
x^=last;
if(opt==3)last=get_rank(x);
else if(opt==4)last=get_val(x+1);
else if(opt==5)last=a[get_pre(x)].v;
else last=a[get_suf(x)].v;
ans^=last;
}
printf("%d",ans);
return 0;
}