P5055可持久化FHQ求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/6/12 12:52
  • 上次更新2024/6/12 17:51:27
查看原帖
P5055可持久化FHQ求调
895435
Zq_water楼主2024/6/12 12:52
#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 2e5+5;
inline int read(){
	register int x=0,f=1;register char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}

int n,last,tot,x,y,z,rt[N];
struct FHQ{int ls,rs,val,sum,siz,rnd,rev;}t[N<<6];

int New(int val){t[++tot]={0,0,val,val,1,rand(),0};return tot;}
int Copy(int x){int rt=New(0);t[rt]=t[x];return rt;}
void pushup(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+t[u].val;
}
void pushdown(int u){
	if(!t[u].rev)return;
	if(t[u].ls)t[u].ls=Copy(t[u].ls);
	if(t[u].rs)t[u].rs=Copy(t[u].rs);
	swap(t[u].ls,t[u].rs);
	if(t[u].ls)t[t[u].ls].rev^=1;
	if(t[u].rs)t[t[u].rs].rev^=1;
	t[u].rev=0;
}
void split(int u,int k,int &x,int &y){
	if(!u){x=y=0;return;}
	pushdown(u);
	if(t[t[u].ls].siz<k){
		x=Copy(u);
		split(t[x].rs,k-t[t[x].ls].siz-1,t[x].rs,y);
		pushup(x);
	}
	else{
		y=Copy(u);
		split(t[y].ls,k,x,t[y].ls);
		pushup(y);
	}
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	pushdown(x),pushdown(y);
	if(t[x].rnd<t[y].rnd){
		t[x].rs=merge(t[x].rs,y);
		pushup(x);return x;
	}
	else{
		t[y].ls=merge(x,t[y].ls);
		pushup(y);return y;
	}
}
void insert(int Past,int Now,int pos,int val){
	split(rt[Past],pos,x,y);
	rt[Now]=merge(merge(x,New(val)),y);
}
void del(int Past,int Now,int pos){
	split(rt[Past],pos-1,x,y),split(y,pos,y,z);
	y=merge(t[y].ls,t[y].rs);
	rt[Now]=merge(merge(x,y),z);
}
void Rev(int Past,int Now,int l,int r){
	split(rt[Past],l-1,x,y),split(y,r,y,z);
	t[y].rev^=1;
	rt[Now]=merge(merge(x,y),z);
}
int Query(int Past,int Now,int l,int r){
	split(rt[Past],l-1,x,y),split(y,r,y,z);
	int ans=t[y].sum;
	rt[Now]=merge(merge(x,y),z);
	return ans;
}

signed main(){
//	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	freopen("P5055_1.in","r",stdin);
//	freopen("P5055.out","w",stdout);
	cin>>n;
	for(int i=1,t,op,l,r,pos,val;i<=n;i++){
		cin>>t>>op;
		if(op==1)cin>>pos>>val,pos^=last,val^=last,insert(t,i,pos,val);
		if(op==2)cin>>pos,pos^=last,del(t,i,pos);
		if(op==3)cin>>l>>r,l^=last,r^=last,Rev(t,i,l,r);
		if(op==4)cin>>l>>r,l^=last,r^=last,last=Query(t,i,l,r),cout<<last<<endl;
	}
	return 0;
}

2024/6/12 12:52
加载中...