Jie_Rans @ 2022-04-28 21:58:04
#include<bits/stdc++.h>
using namespace std;
int read()
{
int s = 0, f = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)) {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * f;
}
const int N=2e6+10;
int n,m,a[N];
int root,tot,rt1,rt2,rt3,val[N],dat[N],size[N],ch[N][3];
void pushup(int x) {
size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
void split(int id,int k,int &x,int &y) {
if(!id)
x=y=0;
else {
if(val[id]<=k)
x=id,split(ch[x][1],k,ch[x][1],y);
else
y=id,split(ch[y][0],k,x,ch[y][0]);
pushup(id);
}
}
int merge(int x,int y) {
if(!x || !y)
return x+y;
if(dat[x]<=dat[y]) {
ch[x][1]=merge(ch[x][1],y);
pushup(x);
return x;
}
ch[y][0]=merge(x,ch[y][0]);
pushup(y);
return y;
}
int New_Node(int x) {
val[++tot]=x;
dat[tot]=rand();
size[tot]=1;
return tot;
}
int Val_query(int id,int x) {
int now=id;
while(now) {
if(x<=size[ch[now][0]])
now=ch[now][0];
else if(x==size[ch[now][0]]+1)
return val[now];
else
x-=size[ch[now][0]]+1,now=ch[now][1];
}
}
int main()
{
freopen("exe.in","r",stdin);
freopen("exe.out","w",stdout);
srand(20051029 + 20051122);
n=read(); m=read();
for(int i=1;i<=n;i++){
int x=read();
split(root,x,rt1,rt2);
root=merge(merge(rt1,New_Node(x)),rt2);
}
int last=0,ans=0;
while(m--) {
int op=read(),x=read();
if(op==1) {
split(root,x,rt1,rt2);
root=merge(merge(rt1,New_Node(x)),rt2);
}
if(op==2) {
split(root,x,rt1,rt2);
split(rt1,x-1,rt1,rt3);
rt3=merge(ch[rt3][0],ch[rt3][1]);
root=merge(merge(rt1,rt3),rt2);
}
if(op==3) {
x^=last;
split(root,x,rt1,rt2);
last=size[rt1]+1;
ans^=last;
}
if(op==4) {
x^=last;
last=Val_query(root,x);
ans^=last;
}
if(op==5) {
x^=last;
split(root,x-1,rt1,rt2);
last=Val_query(rt1,size[rt1]);
ans^=last;
root=merge(rt1,rt2);
}
if(op==6) {
x^=last;
split(root,x,rt1,rt2);
last=Val_query(rt2,1);
ans^=last;
root=merge(rt1,rt2);
}
}
printf("%d",ans);
return 0;
}
by Terrible @ 2022-04-29 01:49:43
@Chengliangjie
if(op==3) {
x^=last;
split(root,x,rt1,rt2);
last=size[rt1]+1;
ans^=last;
}
split
完没有merge
,而且根据你写的split
的实现,应该为 split(root,x-1,rt1,rt2);
.
还有其他地方有误,TLE的原因可能是Val_query
没有返回值,就是说now最后等于0了,这意味着还是有一些其他错误的。
我反正罢工了,睡觉去了,你干脆用你的弱化版的板子改改交上去吧。