如题
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,pp;
int a[N],d[N],lazyj[N],lazyc[N];
void up(int p)
{
d[p]=(d[p<<1]+d[p<<1|1])%p;
}
void down(int p,int l,int r,int mid)
{
d[p<<1]=(d[p<<1]*lazyc[p]%pp+lazyj[p]*(mid-l+1))%pp;
d[p<<1|1]=(d[p<<1|1]*lazyc[p]%pp+lazyj[p]*(r-mid))%pp;
lazyj[p<<1]=(lazyj[p]+lazyc[p]*lazyj[p<<1]%pp)%pp;
lazyc[p<<1]=(lazyc[p]*lazyc[p<<1])%pp;
lazyj[p<<1|1]=(lazyj[p<<1|1]+lazyc[p]*lazyj[p<<1]%pp)%pp;
lazyc[p<<1|1]=(lazyc[p<<1|1]*lazyc[p])%pp;
lazyj[p]=0;
lazyc[p]=1;
}
void build(int l,int r,int p)
{
if(l==r)
{
d[p]=a[l]%pp;
return;
}
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
up(p);
}
void change1(int l,int r,int s,int e,int p,int ad)
{
if(s<=l&&e>=r)
{
d[p]+=ad*(r-l+1)%pp;
lazyj[p]=(lazyj[p]+ad)%pp;
return;
}
int mid=(l+r)>>1;
down(p,l,r,mid);
if(s<=mid)change1(l,mid,s,e,p<<1,ad);
if(e>mid)change1(mid+1,r,s,e,p<<1|1,ad);
up(p);
}
void change2(int l,int r,int s,int e,int p,int ad)
{
if(s<=l&&e>=r)
{
d[p]=(d[p]*ad)%pp;
lazyc[p]=(lazyc[p]*ad)%pp;
lazyj[p]=(lazyj[p]*ad)%pp;
return;
}
int mid=(l+r)>>1;
down(p,l,r,mid);
if(s<=mid)change2(l,mid,s,e,p<<1,ad);
if(e>mid)change2(mid+1,r,s,e,p<<1|1,ad);
up(p);
}
int getsum(int l,int r,int s,int e,int p)
{
// cout<<s<<" "<<e<<" "<<l<<" "<<r<<" "<<p<<endl;
if(s<=l&&e>=r)return d[p];
int ans=0;
int mid=(l+r)>>1;
down(p,l,r,mid);
if(s<=mid)ans+=getsum(l,mid,s,e,p<<1);
ans%=pp;
if(e>mid)ans+=getsum(mid+1,r,s,e,p<<1|1);
return ans%pp;
}
signed main()
{
cin>>n>>m>>pp;
for(int i=1; i<=n; i++)scanf("%lld",&a[i]);
build(1,n,1);
int mod,l,r,k;
for(int i=1; i<=m; i++)
{
scanf("%lld",&mod);
if(mod==1)
{
scanf("%lld%lld%lld",&l,&r,&k);
change1(1,n,l,r,1,k);
}
else if(mod==2)
{
scanf("%lld%lld%lld",&l,&r,&k);
change2(1,n,l,r,1,k);
}
else if(mod==3)
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",getsum(1,n,l,r,1));
}
}
return 0;
}