题目p3373
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=400005;
int n,q,mod;
int a[100005],d[N],lzj[N],lzc[N];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
inline void cf(int b[],int x,int k)
{
b[x]=(b[x]*k)%mod;
}
inline void jf(int b[],int x,int k)
{
b[x]=(b[x]+k)%mod;
}
inline void build(int s,int t,int p)
{
lzc[p]=1;
if(s==t)
{
d[p]=a[s]%mod;
return ;
}
int mid=s+(t-s)/2;
build(s,mid,p*2),build(mid+1,t,p*2+1);
// jf(d,p,d[p*2]+d[p*2+1]);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline void pushdown(int l,int r,int p)
{
int mid=l+(r-l)/2;
if(lzc[p]!=1)
{
cf(d,p*2,lzc[p]),cf(lzc,p*2,lzc[p]),cf(lzj,p*2,lzc[p]);
cf(d,p*2+1,lzc[p]),cf(lzc,p*2+1,lzc[p]),cf(lzj,p*2+1,lzc[p]);
lzc[p]=1;
}
if(lzj[p])
{
jf(d,p*2,lzj[p]*(mid-l+1)),jf(lzj,p*2,lzj[p]);
jf(d,p*2+1,lzj[p]*(r-mid)),jf(lzj,p*2+1,lzj[p]);
lzj[p]=0;
}
return ;
}
inline void cheng(int l,int r,int s,int t,int p,int k)
{
if(l<=s&&t<=r)
{
cf(d,p,k),cf(lzc,p,k),cf(lzj,p,k);
return ;
}
pushdown(s,t,p);
int mid=s+(t-s)/2;
if(l<=mid)cheng(l,r,s,mid,p*2,k);
if(mid+1<=r)cheng(l,r,mid+1,t,p*2+1,k);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline void jia(int l,int r,int s,int t,int p,int k)
{
if(l<=s&&t<=s)
{
jf(d,p,k*(t-s+1)),jf(lzj,p,k);
return ;
}
pushdown(s,t,p);
int mid=s+(t-s)/2;
if(l<=mid)jia(l,r,s,mid,p*2,k);
if(mid+1<=r)jia(l,r,mid+1,t,p*2+1,k);
d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline int getans(int l,int r,int s,int t,int p)
{
if(l<=s&&t<=r)
{
return d[p]%mod;
}
pushdown(s,t,p);
int mid=s+(t-s)/2;
int sum=0;
if(l<=mid)sum=(sum+getans(l,r,s,mid,p*2))%mod;
if(mid+1<=r)sum=(sum+getans(l,r,mid+1,t,p*2+1))%mod;
return sum%mod;
}
signed main()
{
n=read(),q=read(),mod=read();
for(int i=1;i<=n;i++)a[i]=read(),a[i]%=mod;
build(1,n,1);
while(q--)
{
int op,x,y,k;
op=read(),x=read(),y=read();
if(op==1)
{
k=read();
cheng(x,y,1,n,1,k%mod);
}
else if(op==2)
{
k=read();
jia(x,y,1,n,1,k%mod);
}
else
{
write(getans(x,y,1,n,1)%mod);
cout<<"\n";
}
}
}