求助测试点1本地通过提交WA
查看原帖
求助测试点1本地通过提交WA
394167
Cure_Wing楼主2024/3/29 16:11
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
using std::cin;using std::cout;
constexpr int N=200005,M=40000005;
int n,v,opt,root[N],cnt,r1,r2,r3;
long long l,r,ans;
struct Treap{
	struct A{int ls,rs,siz,val,rd;long long sum;bool tag;}a[M];
	inline int newnode(int v){a[++cnt].sum=a[cnt].val=v;a[cnt].rd=rand();a[cnt].siz=1;return cnt;}
	inline void pushup(int p){
		a[p].siz=a[a[p].ls].siz+a[a[p].rs].siz+1;
		a[p].sum=a[a[p].ls].sum+a[a[p].rs].sum+a[p].val;
	}
	inline void pushdown(int p){
		A t;
		if(a[p].ls){t=a[a[p].ls];a[p].ls=++cnt;a[cnt]=t;}
		if(a[p].rs){t=a[a[p].rs];a[p].rs=++cnt;a[cnt]=t;}
		if(a[p].tag) std::swap(a[p].ls,a[p].rs);
		if(a[p].ls) a[a[p].ls].tag^=a[p].tag;
		if(a[p].rs) a[a[p].rs].tag^=a[p].tag;
		a[p].tag=0;
	}
	inline void split(int p,int k,int &x,int &y){
		if(!p){x=y=0;return ;}
		pushdown(p);
		if(k<=a[a[p].ls].siz){y=++cnt;a[y]=a[p];split(a[y].ls,k,x,a[y].ls);pushup(y);}
		else{x=++cnt;a[x]=a[p];split(a[x].rs,k-a[a[x].ls].siz-1,a[x].rs,y);pushup(x);}
	}
	inline int merge(int x,int y){
		if(!x||!y) return x|y;
		if(a[x].rd<a[y].rd){pushdown(x);a[x].rs=merge(a[x].rs,y);pushup(x);return x;}
		pushdown(y);a[y].ls=merge(x,a[y].ls);pushup(y);return y;
	}
}treap;
signed main(){
	freopen("P5055_1.in","r",stdin);
	freopen("P5055.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n;srand(time(0));
	for(int i=1;i<=n;++i){
		cin>>v>>opt>>l;root[i]=root[v];l^=ans;
		if(opt==1){
			cin>>r;r^=ans;
			treap.split(root[i],l,r1,r2);
			root[i]=treap.merge(r1,treap.merge(treap.newnode(r),r2));
		}
		if(opt==2){
			treap.split(root[i],l,r1,r3);
			treap.split(r1,l-1,r1,r2);
			root[i]=treap.merge(r1,r3);
		}
		if(opt==3){
			cin>>r;r^=ans;
			treap.split(root[i],r,r1,r3);
			treap.split(r1,l-1,r1,r2);
			treap.a[r2].tag^=1;
			root[i]=treap.merge(r1,treap.merge(r2,r3));
		}
		if(opt==4){
			cin>>r;r^=ans;
			treap.split(root[i],r,r1,r3);
			treap.split(r1,l-1,r1,r2);
			cout<<(ans=treap.a[r2].sum)<<'\n';
			root[i]=treap.merge(r1,treap.merge(r2,r3));
		}
	}
	return 0;
}
2024/3/29 16:11
加载中...