我的代码
#include<bits/stdc++.h>
#define lc x*2
#define rc x*2+1
#define ll long long
using namespace std;
struct node{
ll l,r,ans,lazy1,lazy2;
}t[500005*4];
ll n,q,x,y,k,op,a[500005],m;
void build(ll x,ll l,ll r){
t[x].lazy1=0,t[x].lazy2=1;
t[x].l=l,t[x].r=r;
if(l==r){
t[x].ans=a[l]%m;
return;
}
ll mid=(l+r)/2;
build(lc,l,mid);
build(rc,mid+1,r);
t[x].ans=(t[lc].ans+t[rc].ans)%m;
}
void down(ll x){
t[lc].lazy1=(t[lc].lazy1*t[x].lazy2+t[x].lazy1)%m;
t[rc].lazy1=(t[rc].lazy1*t[x].lazy2+t[x].lazy1)%m;
t[lc].lazy2=(t[lc].lazy2*t[x].lazy2)%m;
t[rc].lazy2=(t[rc].lazy2*t[x].lazy2)%m;
t[lc].ans=(t[x].lazy1*(t[lc].r-t[lc].l+1)%m+t[lc].ans*t[x].lazy2%m)%m;
t[rc].ans=(t[x].lazy1*(t[rc].r-t[rc].l+1)%m+t[rc].ans*t[x].lazy2%m)%m;
t[x].lazy1=0;t[x].lazy2=1;
}
void cxa(ll x,ll l,ll r,ll k){
if(t[x].l>=l&&t[x].r<=r){
t[x].ans+=k*(t[x].r-t[x].l+1)%m;
t[x].lazy1+=k;
return;
}
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) cxa(lc,l,r,k);
if(r>mid) cxa(rc,l,r,k);
t[x].ans=(t[lc].ans+t[rc].ans)%m;
}
void cza(ll x,ll l,ll r,ll k){
if(t[x].l>=l&&t[x].r<=r){
t[x].ans=t[x].ans*k%m;
t[x].lazy1=t[x].lazy1*k;
t[x].lazy2=t[x].lazy2*k;
return;
}
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) cza(lc,l,r,k);
if(r>mid) cza(rc,l,r,k);
t[x].ans=(t[lc].ans+t[rc].ans)%m;
}
long long sum(ll x,ll l,ll r){
long long s=0;
if(t[x].l>=l&&t[x].r<=r)
return t[x].ans;
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) s+=sum(lc,l,r);
s%=m;
if(r>mid) s+=sum(rc,l,r);
return s%m;
}
int main(){
cin>>n>>q>>m;
for(ll i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
cxa(1,x,y,k);
}
if(op==2){
cin>>k;
cza(1,x,y,k);
}
if(op==3)
cout<<sum(1,x,y)<<"\n";
}
return 0;
}