本人时间不够充裕,还请大佬帮忙看看。
样例输出:17 2
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (p<<1)
#define rs (p<<1|1)
const int N=1e5+10;
int mod,a[N];
ll t[N*4],taga[N*4],tagm[N*4];
void update(int p){
t[p]=(t[ls]+t[rs])%mod;
}
void build(int p,int pl,int pr){
taga[p]=0;
tagm[p]=1;
if(pl==pr){
t[p]=a[pl];
return;
}
int mid=(pl+pr)>>1;
build(ls,pl,mid);
build(rs,mid+1,pr);
update(p);
}
void tagd3(int p,int pl,int pr){
int mid=(pl+pr)>>1;
t[ls]=t[ls]*tagm[p]%mod+taga[p]*(mid-pl+1)%mod;
t[rs]=t[rs]*tagm[p]%mod+taga[p]*(pr-mid)%mod;
tagm[ls]=tagm[ls]*tagm[p]%mod;
tagm[rs]=tagm[rs]*tagm[p]%mod;
taga[ls]=(taga[ls]*tagm[p]%mod+taga[p])%mod;
taga[rs]=(taga[rs]*tagm[p]%mod+taga[p])%mod;
taga[p]=0;
tagm[p]=1;
}
void cha(int p,int pl,int pr,int l,int r,int k){
if(l<=pl&&pr<=r){
taga[p]=(taga[p]+k)%mod;
t[p]=(t[p]+(pr-pl+1)*k)%mod;
return;
}
tagd3(p,pl,pr);
int mid=(pl+pr)>>1;
if(l<=mid)cha(ls,pl,mid,l,r,k);
if(r>mid)cha(rs,mid+1,pr,l,r,k);
update(p);
}
void chm(int p,int pl,int pr,int l,int r,int k){
if(l<=pl&&pr<=r){
t[p]=(t[p]*k)%mod;
tagm[p]=(tagm[p]*k)%mod;
taga[p]=(taga[p]*k)%mod;
return;
}
tagd3(p,pl,pr);
int mid=(pl+pr)>>1;
if(l<=mid)chm(ls,pl,mid,l,r,k);
if(mid<r)chm(rs,mid+1,pr,l,r,k);
update(p);
}
ll q3(int p,int pl,int pr,int l,int r){
if(l<=pl&&pr<=r){
return t[p];
}
tagd3(p,pl,pr);
int mid=(pl+pr)>>1;
ll ans=0;
if(l<=mid)ans=ans+q3(ls,pl,mid,l,r)%mod;
if(r>mid)ans=ans+q3(rs,mid+1,pr,l,r)%mod;
return ans%mod;
}
int main(){
int n,q,x,y,k,op;
scanf("%d%d%d",&n,&q,&mod);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
while(q--){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%d",&k);
chm(1,1,n,x,y,k);
}else if(op==2){
scanf("%d",&k);
cha(1,1,n,x,y,k);
}else{
cout<<q3(1,1,n,x,y)%mod<<endl;
}
}
return 0;
}