社区讨论

蒟蒻线段树求调

P3373【模板】线段树 2参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2ateyx
此快照首次捕获于
2023/10/23 10:48
2 年前
此快照最后确认于
2023/11/03 10:59
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 400005
#define M 100005
#define int long long
using namespace std;
int n,m,mod;int a[M],sum[N],lzy[N],mul[N];
inline void pushup(int p){
	sum[p]=(sum[p<<1]+sum[p<<1|1])%mod;
}
inline void calc(int p,int l,int r,int k,int c){
	lzy[p]=(lzy[p]*c+k)%mod;
	mul[p]*=c%mod;
	sum[p]=(sum[p]*c+(r-l+1)*k)%mod;
}
inline void pushdown(int p,int l,int r){
	int mid=l+r>>1;
	calc(p<<1,l,mid,lzy[p],mul[p]);
	calc(p<<1|1,mid+1,r,lzy[p],mul[p]);
	lzy[p]=0;mul[p]=1;
}
inline void build(int p,int l,int r){
	mul[p]=1;
	if(l==r){
		sum[p]=a[l]%mod;
		return ;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline void change(int p,int l,int r,int L,int R ,int c,int k){
	if(L<=l&&R>=r){
		sum[p]=(sum[p]*c+k*(r-l+1))%mod;
		lzy[p]=(lzy[p]*c+k)%mod;
		mul[p]=mul[p]*c%mod;
	}
	pushdown(p,l,r);
	int mid=l+r>>1;
	if(L<=mid)change(p<<1,l,mid,L,R,c,k);
	if(R>mid)change(p<<1|1,mid+1,r,L,R,c,k);
	pushup(p); 
}
inline int get(int p,int l,int r,int L,int R){
	if(L<=l&&R>=r){
		return sum[p]%mod;
	}
	int mid=l+r>>1;int res=0;
	if(L<=mid)res+=get(p<<1,l,mid,L,R)%mod;
	if(R>mid)res+=get(p<<1|1,mid+1,r,L,R)%mod;
	return res;
} 
signed main(){
	cin.tie(0)->sync_with_stdio(false);
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			int k;cin>>k;
			change(1,1,n,x,y,k,0);
		}
		if(op==2){
			int k;cin>>k;
			change(1,1,n,x,y,1,k);
		}
		else cout<<get(1,1,n,x,y)<<'\n';
	}
	return 0;
} 

回复

1 条回复,欢迎继续交流。

正在加载回复...