可持久化FHQ treap求调
  • 板块灌水区
  • 楼主Jerry_heng
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/1 13:04
  • 上次更新2024/5/1 13:38:22
查看原帖
可持久化FHQ treap求调
763878
Jerry_heng楼主2024/5/1 13:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,lasans,tot,cnt;
struct node{
	int key,val,tag,sum,siz,ls,rs;
}tree[20000010];
int rt[200010];
int make(int val){
	tree[++tot]=(node){rand(),val,0,val,1,0,0};
	return tot;
}
int make_node(int x){
	tree[++tot]=tree[x];
	return tot;
}
void pushup(int o){
	if(tree[o].ls)tree[o].siz+=tree[tree[o].ls].siz,tree[o].sum+=tree[tree[o].ls].sum;
	if(tree[o].rs)tree[o].siz+=tree[tree[o].rs].siz,tree[o].sum+=tree[tree[o].rs].sum;
	tree[o].siz++,tree[o].sum+=tree[o].val;
}
void pushdown(int o){
	if(!tree[o].tag)return;
	if(tree[o].ls)tree[o].ls=make_node(tree[o].ls);
	if(tree[o].rs)tree[o].rs=make_node(tree[o].rs);
	swap(tree[o].ls,tree[o].rs);
	if(tree[o].ls)tree[tree[o].ls].tag^=1;
	if(tree[o].rs)tree[tree[o].rs].tag^=1;
	tree[o].tag=0;
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	pushdown(x);pushdown(y);
	if(tree[x].key<tree[y].key){
		tree[x].rs=merge(tree[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		tree[y].ls=merge(x,tree[y].ls);
		pushup(y);
		return y;
	}
}
void split(int o,int k,int &l,int &r){
	if(!o){
		l=r=0;
		return;
	}
	pushdown(o);
	if(tree[tree[o].ls].siz<k){
		l=make_node(o);
		split(tree[l].rs,k-tree[tree[o].ls].siz-1,tree[l].rs,r);
		pushup(l);
	}
	else{
		r=make_node(o);
		split(tree[r].ls,k,l,tree[r].ls);
		pushup(r);
	}
}
signed main(){
	srand(763878);
	scanf("%lld",&n);
	while(n--){
		int v,op,l,r,a,b,rt1,rt2,rt3;
		scanf("%lld%lld",&v,&op);
		if(op==1){
			scanf("%lld%lld",&a,&b);
			a^=lasans,b^=lasans;
			split(rt[v],a,rt1,rt2);
			rt[++cnt]=merge(merge(rt1,make(b)),rt2);
		}
		if(op==2){
			scanf("%lld",&a);
			a^=lasans;
			split(rt[v],a,rt1,rt3);
			split(rt1,a-1,rt1,rt2);
			rt[++cnt]=merge(rt1,rt3);
		}
		if(op==3){
			scanf("%lld%lld",&a,&b);
			a^=lasans,b^=lasans;
			split(rt[v],b,rt1,rt3);
			split(rt1,a-1,rt1,rt2);
			tree[rt2].tag^=1;
			rt[++cnt]=merge(merge(rt1,rt2),rt3);
		}
		if(op==4){
			scanf("%lld%lld",&a,&b);
			a^=lasans,b^=lasans;
			split(rt[v],b,rt1,rt3);
			split(rt1,a-1,rt1,rt2);
			printf("%lld\n",lasans=tree[rt2].sum);
			rt[++cnt]=merge(merge(rt1,rt2),rt3);
		}
	}
	return 0;
}
2024/5/1 13:04
加载中...