MnZn初学fhq,有T有WA 求调
查看原帖
MnZn初学fhq,有T有WA 求调
182792
Jie_Rans楼主2022/4/28 21:58
#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;
}


2022/4/28 21:58
加载中...