只过最后一个点求调
查看原帖
只过最后一个点求调
989792
lrx___楼主2024/8/14 13:13
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<deque>
#include<vector>
typedef long long ll;

const int N(2e5+5);
int root[N],n;
ll last_ans;
struct node{
	bool lz;
	int ls,rs,sz,vl,pri;
	ll sum;
	node(){}
	node(int sz,int vl):lz(false),ls(0),rs(0),sz(sz),vl(vl),pri(rand()),sum(vl){}
};
std::deque<node> t;
std::vector<int> rb;

int new_node(int k){
	int u;
	if(rb.size()){
		u=rb.back();rb.pop_back();
	}else{
		u=t.size();t.push_back(node());
	}
	t[u]=node(1,k);
	return u;
}
int cpy(int u){
	int v(new_node(0));
	t[v]=t[u];
	return v;
}
void push_u(int u){
	t[u].sz=t[t[u].ls].sz+t[t[u].rs].sz+1;
	t[u].sum=t[t[u].ls].sum+t[t[u].rs].sum+t[u].vl;
}
void tag(int &u){
	if(u){
		u=cpy(u);
		t[u].lz^=true;
		std::swap(t[u].ls,t[u].rs);
	}
}
void push_d(int u){
	if(t[u].lz){
		tag(t[u].ls);
		tag(t[u].rs);
		t[u].lz=false;
	}
}
void split(int u,int k,int &l,int &r){
	if(u==0){
		l=r=0;return;
	}
	push_d(u);
	u=cpy(u);
	if(k<t[t[u].ls].sz+1){
		r=u;
		split(t[u].ls,k,l,t[u].ls);
	}else{
		l=u;
		split(t[u].rs,k-t[t[u].ls].sz-1,t[u].rs,r);
	}
	push_u(u);
}
void merge(int l,int r,int &u){
	if(l==0||r==0){
		u=l|r;return;
	}
	push_d(l);push_d(r);
	if(t[l].pri>t[r].pri){
		u=l;
		merge(t[l].rs,r,t[l].rs);
	}else{
		u=r;
		merge(l,t[r].ls,t[r].ls);
	}
	push_u(u);
}
void insert(int &u,int p,int k){
	int l,r,v;
	split(u,p,l,r);
	v=new_node(k);
	merge(l,v,l);merge(l,r,u);
}
void erase(int &u,int p){
	int l,r,v;
	split(u,p,l,r);
	split(l,p-1,l,v);
	rb.push_back(v);
	merge(l,r,u);
}
void rever(int &u,int l,int r){
	int v,w,x;
	split(u,r,v,w);
	split(v,l-1,v,x);
	tag(x);
	merge(v,x,v);merge(v,w,u);
}
ll query(int &u,int l,int r){
	int v,w,x;
	ll res;
	split(u,r,v,w);
	split(v,l-1,v,x);
	res=t[x].sum;
	merge(v,x,v);merge(v,w,u);
	return res;
}
int main(){
	int i,n,v,o,l,r;
	t.push_back(node(0,0));
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d%d",&v,&o);
		root[i]=root[v];
		switch(o){
			case 1:
				scanf("%d%d",&l,&r);
				l^=last_ans;r^=last_ans;
				insert(root[i],l,r);
				break;
			case 2:
				scanf("%d",&l);
				l^=last_ans;
				erase(root[i],l);
				break;
			case 3:
				scanf("%d%d",&l,&r);
				l^=last_ans;
				rever(root[i],l,r);
				break;
			case 4:
				scanf("%d%d",&l,&r);
				l^=last_ans;r^=last_ans;
				printf("%lld\n",last_ans=query(root[i],l,r));
		}
	}
	return 0;
}

2024/8/14 13:13
加载中...