求条
查看原帖
求条
906970
Jerry_Money楼主2025/1/19 17:20
#include<bits/stdc++.h>
#define int long long
using namespace std;
int b[1000086];
int n,m;
struct sb{
	int sum,tag_add,tag_mul;
}a[1000086];
int mod;
void build(int w,int l,int r){
	a[w].tag_mul=1;
	if(l==r){
		a[w].sum=b[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*w,l,mid);
	build(2*w+1,mid+1,r);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
}
void spread(int w,int l,int r){
	if(a[w].tag_add!=0||a[w].tag_mul!=1){
		int mid=(l+r)/2;
		a[2*w].sum*=a[w].tag_mul%mod;a[2*w].sum%=mod;
		a[2*w].sum+=(mid-l+1)*a[w].tag_add%mod;a[2*w].sum%=mod;
		a[2*w].tag_add+=a[w].tag_add%mod;a[2*w].tag_add%=mod;
		a[2*w].tag_mul*=a[w].tag_mul%mod;a[2*w].tag_mul%=mod;
		a[2*w+1].sum*=a[w].tag_mul%mod;a[2*w+1].sum%=mod;
		a[2*w+1].sum+=(r-mid)*a[w].tag_add%mod;a[2*w+1].sum%=mod;
		a[2*w+1].tag_add+=a[w].tag_add%mod;a[2*w+1].tag_add%=mod;
		a[2*w+1].tag_mul*=a[w].tag_mul%mod;a[2*w+1].tag_mul%=mod;
		a[w].tag_add=0;
		a[w].tag_mul=1;
	}
}
void add(int w,int l,int r,int ql,int qr,int k){
	if(ql<=l&&qr>=r){
		a[w].tag_add+=k;
		a[w].sum+=(k*(r-l+1))%mod;
		a[w].tag_add%=mod,a[w].sum%=mod;
		return;
	}
	spread(w,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)add(2*w,l,mid,ql,qr,k);
	if(qr>mid)add(2*w+1,mid+1,r,ql,qr,k);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
	a[w].sum%=mod;
}
void mul(int w,int l,int r,int ql,int qr,int k){
	if(ql<=l&&qr>=r){
		a[w].tag_mul*=k;
		a[w].tag_add*=k;
		a[w].sum*=k;
		a[w].tag_add%=mod,a[w].tag_mul%=mod,a[w].sum%=mod;
		return;
	}
	spread(w,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)mul(2*w,l,mid,ql,qr,k);
	if(qr>mid)mul(2*w+1,mid+1,r,ql,qr,k);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
	a[w].sum%=mod;
}
int getsum(int w,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r)return a[w].sum%mod;
	spread(w,l,r);
	int mid=(l+r)/2;
	int ans=0;
	if(ql<=mid)ans+=getsum(2*w,l,mid,ql,qr)%mod;
	if(qr>mid)ans+=getsum(2*w+1,mid+1,r,ql,qr)%mod;
	return ans%mod;
}
signed main()
{
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)cin>>b[i];
	build(1,1,n);
	while(m--){
		int opt,x,y,k;
		cin>>opt>>x>>y;
		if(!(opt-1)){
			cin>>k;
			mul(1,1,n,x,y,k);
		}
		else if(!(opt-2)){
			cin>>k;
			add(1,1,n,x,y,k);
		}
		else {
			cout<<getsum(1,1,n,x,y)%mod<<"\n";
		}
	}
	return 0;
}
2025/1/19 17:20
加载中...