线段树2捞,悬关
查看原帖
线段树2捞,悬关
570957
kimi123楼主2023/10/13 09:46
#include <bits/stdc++.h>
#define ll long long
#define zb x*2
#define yb x*2+1
//左右节点 
using namespace std;
const int N=1e5+10;
struct Seg{
	ll tag,sum,mul;
	int l,r;
	#define l(x) st[x].l
	#define r(x) st[x].r
	#define sum(x) st[x].sum
	#define tag(x) st[x].tag
	#define mul(x) st[x].mul
}st[4*N];
ll a[N];
int n,m,q;
void pushup(int x){
	sum(x)=(sum(zb)+sum(yb))%m;
}
void pushdown(int x){
		sum(zb)=(sum(zb)*mul(x)+tag(x)*(r(zb)-l(zb)+1))%m; 
		sum(yb)=(sum(yb)*mul(x)+tag(x)*(r(yb)-l(yb)+1))%m;
		mul(zb)=mul(zb)*mul(x)%m;
		mul(yb)=mul(yb)*mul(x)%m;
		tag(zb)=(tag(zb)*mul(x)+tag(x))%m;
		tag(yb)=(tag(yb)*mul(x)+tag(x))%m;
		tag(x)=0; mul(x)=1;
}
void build(int x,int l,int r){
	l(x)=l;r(x)=r;mul(x)=1;
	if(l==r){
		sum(x)=a[l]%m;
		return;
	}
		int mid=(l+r)>>1;
		build(zb,l,mid);
		build(yb,mid+1,r);
		pushup(x);
}
void modify(int x,int l,int r,ll k){
	if(l<=l(x)&&r>=r(x)){
		sum(x)=(sum(x)+k*(r(x)-l(x)+1))%m;
		tag(x)=(tag(x)+k)%m;
		return;
	}
	pushdown(x);
	int mid=(l(x)+r(x))>>1;
	if(l<=mid) modify(zb,l,r,k);
	if(r>mid) modify(yb,l,r,k);
	pushup(x); 
}
//
void modify2(int x,int l,int r,ll k){
	if(l<=l(x)&&r>=r(x)){
		sum(x)=(sum(x)*k)%m;
		mul(x)=(mul(x)*k)%m;
		tag(x)=(tag(x)*k)%m;
		return;
	}
	pushdown(x);
	int mid=(l(x)+r(x))>>1;
	if(l<=mid) modify(zb,l,r,k);
	if(r>mid) modify(yb,l,r,k);
	pushup(x);
}
ll query(int x,int l,int r){
	if(l<=l(x)&&r>=r(x)){
		return sum(x)%m;
	}
	pushdown(x);
	ll ans=0;
	int mid=(l(x)+r(x))>>1;
	if(l<=mid) ans=(ans+query(zb,l,r))%m;
	if(r>mid) ans=(ans+query(yb,l,r))%m;
	return ans%m;
}
int main(){
	scanf("%d%d%d",&n,&q,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int op;
		scanf("%d",&op);
		int x,y;  ll k;
		if(op==1){
			scanf("%d%d%lld",&x,&y,&k);
			modify2(1,x,y,k);
		}
		else if(op==2){
			scanf("%d%d%lld",&x,&y,&k);
			modify(1,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	}
	return 0;
} 
/*
2 5 100000
3 5
2 1 2 3
1 1 2 10
3 1 2
2 1 2 3
3 1 2
*/
2023/10/13 09:46
加载中...