WHY 0pts
查看原帖
WHY 0pts
1329138
luogu_hezhenmin1楼主2025/2/8 15:33
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX=1e9;
const int N=2e5+5;
struct node{int ls,rs,val,pri,siz,lazy;ll sum;}t[N<<7];
int cnt=0,root[N];
mt19937 rng(time(0));
int inline read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
} 
int inline newnode(int x){
	t[++cnt].siz=1,t[cnt].val=x,t[cnt].sum=x,t[cnt].pri=rng()%MAX+1;
	return cnt;
} 
int inline clone(int u){
	int ret=newnode(0);
	t[ret]=t[u];
	return ret;
}
void inline update(int u){
	t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
	t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+1;
}
void inline pushdown(int u){
	if(t[u].lazy){
		if(t[u].ls) t[u].ls=clone(t[u].ls); if(t[u].rs) t[u].rs=clone(t[u].rs);
		swap(t[u].ls,t[u].rs); t[t[u].ls].lazy^=1,t[t[u].rs].lazy^=1;t[u].lazy=0;
	}
}
void inline split(int u,int x,int &l,int &r){
	if(u==0){l=r=0;return;}
	pushdown(u);
	if(t[t[u].ls].siz+1<=x){l=clone(u);split(t[l].rs,x-t[t[u].ls].siz-1,t[l].rs,r);update(l);}
	else{r=clone(u);split(t[r].ls,x,l,t[r].ls);update(r);}
}
int inline merge(int l,int r){
	if(l==0 or r==0) return l+r;
	pushdown(l);pushdown(r);
	if(t[l].pri>t[r].pri){t[l].rs=merge(t[l].rs,r);update(l);return l;}
	else{t[r].ls=merge(t[r].ls,l);update(r);return r;} 
}
int main(){
	int rt_cnt=0,l,r,p,n=read();ll x,y,ans=0;
	while(n--){
		int v=read(),op=read();x=read(),x^=ans;
		if(op==1){
			y=read();y^=ans;
			split(root[v],x,l,p);
			root[++rt_cnt]=merge(merge(l,newnode(y)),p);
		}
		if(op==2){
			split(root[v],x,l,r);split(l,x-1,l,p);
			root[++rt_cnt]=merge(l,r);
		}
		if(op==3){
			y=read();y^=ans;
			split(root[v],y,l,r);split(l,x-1,l,p);
			t[p].lazy^=1;
			root[++rt_cnt]=merge(merge(l,p),r);
		}
		if(op==4){
			y=read();y^=ans;
			split(root[v],y,l,r);split(l,x-1,l,p);
			ans=t[p].sum;
			cout<<ans<<'\n';
			root[++rt_cnt]=merge(merge(l,p),r);
		}
	}
	return 0;
}
2025/2/8 15:33
加载中...