0分求助
查看原帖
0分求助
585506
xiaomizhongmi楼主2024/4/20 14:22
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc x<<1
#define rc x<<1|1
int a[550000];
struct fu {
	int sum,add,mdd,r,l;
} t[550000];
int n,m;
int mm;
void bt(int x,int l,int r) {
	t[x].mdd=1;
	t[x].add=0;
	t[x].l=l;
	t[x].r=r;
	if(l==r) {
		t[x].sum=a[l];
		return ;
	}
	int mid=(l+r)/2;
	bt(lc,l,mid);
	bt(rc,mid+1,r);
	t[x].sum=(t[lc].sum+t[rc].sum)%mm;
}
void sd(int x,int l,int r) {
	int mid=(l+r)/2;
	t[lc].sum=(t[lc].sum*t[x].mdd+t[lc].add*(mid-l+1))%mm;
	t[rc].sum=(t[rc].sum*t[x].mdd+t[rc].add*(r-mid))%mm;
	t[lc].mdd=(t[lc].mdd*t[x].mdd)%mm;
	t[rc].mdd=(t[rc].mdd*t[x].mdd)%mm;
	t[lc].add=(t[lc].add*t[x].mdd+t[x].add)%mm;
	t[rc].add=(t[rc].add*t[x].mdd+t[x].add)%mm;
	t[x].mdd=1;
	t[x].add=0;
	return ;
}
void ad(int l,int r,int num,int mum,int x) {
	if(r<t[x].l||t[x].r<l)return;
	if(t[x].l>=l&&t[x].r<=r) {
		t[x].add=(t[x].add+num)%mm;
		t[x].sum=(t[x].sum+(t[x].r-t[x].l+1)*num)%mm;
		t[x].sum=(t[x].sum*mum)%mm;
		t[x].mdd=(t[x].mdd*mum)%mm;
		t[x].add=(t[x].add*mum)%mm;
		return ;
	}
	sd(x,t[x].l,t[x].r);
	int mid=(t[x].l+t[x].r)>>1;
	ad(l,r,num,mum,lc);
	ad(l,r,num,mum,rc);
	t[x].sum=(t[lc].sum+t[rc].sum)%mm;
}
int fd(int l,int r,int x) {
	if(r<t[x].l||t[x].r<l)return 0;
	if(t[x].l>=l&&t[x].r<=r) {
		return t[x].sum%mm;
	}
	int mid=(t[x].l+t[x].r)>>1;
	sd(x,t[x].l,t[x].r);
	return (fd(l,r,lc)%mm+fd(l,r,rc)%mm)%mm;
}
signed main() {
	cin>>n>>m>>mm;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
	}
	bt(1,1,n);
	for(int i=1; i<=m; i++) {
		int q=0;
		cin>>q;
		int st=0,w=0,e=0;
		if(q==1) {
			cin>>st>>w>>e;
			ad(st,w,0,e,1);
		} else if(q==2) {
			cin>>st>>w>>e;
			ad(st,w,e,1,1);
		} else if(q==3) {
			cin>>st>>w;
			cout<<fd(st,w,1)<<endl;
		}
	}
	return 0;
}
2024/4/20 14:22
加载中...