P5055求调
  • 板块题目总版
  • 楼主gf20231114
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/25 14:22
  • 上次更新2024/5/25 16:32:07
查看原帖
P5055求调
1246864
gf20231114楼主2024/5/25 14:22

交上去报0

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n;
struct node{
	int ls,rs,num,pri,siz;
	long long sum;
	bool tag;
}tr[maxn<<7];
int cnt_tr,root[maxn];
int New_node(int x){
	tr[++cnt_tr].num=tr[cnt_tr].sum=x;
	tr[cnt_tr].pri=rand(),tr[cnt_tr].siz=1;
	return cnt_tr;
}int Clone(int id){
	int ret=New_node(0);
	tr[ret]=tr[id];
	return ret;
}void Push_up(int id){
	tr[id].siz=tr[tr[id].ls].siz+tr[tr[id].rs].siz+1;
	tr[id].sum=tr[tr[id].ls].sum+tr[tr[id].rs].sum+tr[id].num;
}void Push_down(int id){
	if(!tr[id].tag){
		return;
	}if(tr[id].ls){
		tr[id].ls=Clone(tr[id].ls);
	}if(tr[id].rs){
		tr[id].rs=Clone(tr[id].rs);
	}swap(tr[id].ls,tr[id].rs);
	tr[tr[id].ls].tag=!tr[tr[id].ls].tag;
	tr[tr[id].rs].tag=!tr[tr[id].rs].tag;
	tr[id].tag=0;
}void Split(int id,int x,int &L,int &R){
	if(!id){
		L=R=0;
		return;
	}Push_down(id);
	if(tr[tr[id].ls].siz+1<=x){
		L=Clone(id);
		Split(tr[L].rs,x-tr[tr[id].ls].siz-1,tr[L].rs,R);
		Push_up(L);
	}else{
		R=Clone(id);
		Split(tr[R].ls,x,L,tr[R].ls);
		Push_up(R);
	} 
}int Merge(int L,int R){
	if(!L||!R){
		return L+R;
	}Push_down(L),Push_down(R);
	if(tr[L].pri>tr[R].pri){
		tr[L].rs=Merge(tr[L].rs,R);
		Push_up(L);
		return L;
	}tr[R].ls=Merge(L,tr[R].ls);
	Push_up(R);
	return R;
}signed main(){
	srand(time(NULL));
	scanf("%d",&n);
	int now=0,L,p,R;
	long long lastans=0;
	for(int i=1;i<=n;i++){
		int v,op;
		scanf("%d%d",&v,&op);
		if(op==1){
			long long pos,x;
			scanf("%lld%lld",&pos,&x);
			pos^=lastans,x^=lastans;
			Split(root[v],pos,L,p);
			root[++now]=Merge(Merge(L,New_node(x)),p);
		}else if(op==2){
			long long pos;
			scanf("%lld",&pos);
			pos^=lastans;
			Split(root[v],pos,L,R);
			Split(L,pos-1,L,p);
			root[++now]=Merge(L,R);
		}else if(op==3){
			long long l,r;
			scanf("%lld%lld",&l,&r);
			l^=lastans,r^=lastans;
			Split(root[v],r,L,R);
			Split(L,l-1,L,p);
			tr[p].tag=!tr[p].tag;
			root[++now]=Merge(Merge(L,p),R);
		}else if(op==4){
			long long l,r;
			scanf("%lld%lld",&l,&r);
			l^=lastans,r^=lastans;
			Split(root[v],r,L,R);
			Split(L,l-1,L,p);
			lastans=tr[p].sum;
			printf("%lld\n",lastans);
			root[++now]=Merge(Merge(L,p),R);
		}
	}return 0;
} 
2024/5/25 14:22
加载中...