#include<bits/stdc++.h>
using namespace std;
int n,q,m;
long long sum[400010],ll[400010],rr[400010],t1[400010],t2[400010];
long long a[100010];
void build(int p,int l,int r)
{
ll[p]=l,rr[p]=r;
if(l==r)
{
sum[p]=a[l]%m;
ll[p]=l;
rr[p]=r;
return;
}
else
{
int mid=(l+r)/2;
build(2*p,l,mid),build(2*p+1,mid+1,r);
sum[p]=sum[2*p]+sum[2*p+1];
sum[p]%=m;
}
}
void down(int p,int g)
{
if(g==1)
{
t1[2*p]*=t1[p]%m;
t1[2*p]%=m;
sum[2*p]*=t1[p]%m;
t1[2*p+1]*=t1[p]%m;
t1[2*p+1]%=m;
sum[2*p+1]*=t1[p]%m;
t2[2*p]*=t1[p]%m;
t2[2*p+1]*=t1[p]%m;
t1[p]=1;
}
if(g==2)
{
t2[2*p]+=t2[p]%m;
t2[2*p]%=m;
sum[2*p]+=(rr[2*p]-ll[2*p]+1)*t2[p]%m;
sum[2*p]%=m;
t2[2*p+1]+=t2[p]%m;
t2[2*p+1]%=m;
sum[2*p+1]+=(rr[2*p+1]-ll[2*p+1]+1)*t2[p]%m;
sum[2*p+1]%=m;
t2[p]=0;
}
}
long long ask(int p,int l,int r)
{
long long s=0;
if(ll[p]>=l&&rr[p]<=r)
{
return sum[p];
}
else
{
if(t1[p]>1) down(p,1);
if(t2[p]>0) down(p,2);
int mid=(ll[p]+rr[p])/2;
if(mid>=l) s+=ask(2*p,l,r)%m;
if(mid+1<=r) s+=ask(2*p+1,l,r)%m;
}
return s%m;
}
void update(int p,int l,int r,int c,int g)
{
if(ll[p]>=l&&rr[p]<=r)
{
if(g==1)
{
sum[p]*=c%m;
sum[p]%=m;
t1[p]*=c%m;
t2[p]*=c%m;
}
if(g==2)
{
if(t1[p]>1)down(p,1);
sum[p]+=(rr[p]-ll[p]+1)*c%m;
t2[p]+=c;
}
return;
}
else
{
if(t1[p]>1) down(p,1);
if(t2[p]>0) down(p,2);
int mid=(ll[p]+rr[p])/2;
if(mid>=l) update(2*p,l,r,c,g);
if(mid+1<=r) update(2*p+1,l,r,c,g);
sum[p]=(sum[2*p]+sum[2*p+1])%m;
sum[p]%=m;
}
}
int main()
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int g,l,r,x;
build(1,1,n);
for(int i=1;i<=q;i++)
{
cin>>g;
if(g==1){
cin>>l>>r>>x;
update(1,l,r,x,1);
}
if(g==2){
cin>>l>>r>>x;
update(1,l,r,x,2);
}
if(g==3){
cin>>l>>r;
cout<<ask(1,l,r)<<endl;
}
}
return 0;
}
样例能过,但是0分,请问如何修改?