qwq
build建树
f懒标记下放
mul乘法
add加法
ans求答案
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,x,y,z,mod,a[100010];
struct tree
{
long long l,r,pre,add,mul=1;
}t[400010];
long long f(long long p)
{
t[p*2].pre=(t[p*2].pre*t[p].mul+t[p].add*(t[p*2].r-t[p*2].l+1))%mod;
t[p*2+1].pre=(t[p*2+1].pre*t[p].mul+t[p].add*(t[p*2+1].r-t[p*2+1].l+1))%mod;
if(t[p].mul!=1)
{
t[p*2].mul=t[p*2].mul*t[p].mul%mod;
t[p*2+1].mul=t[p*2+1].mul*t[p].mul%mod;
}
t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%mod;
t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%mod;
t[p].add=0;
t[p].mul=1;
return 0;
}
long long build(long long p,long long l,long long r)
{
t[p].l=l;
t[p].r=r;
if(l==r)
{
t[p].pre=a[l]%mod;
return 0;
}
long long mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
return 0;
}
long long add(long long p,long long l,long long r,long long num)
{
if(l<=t[p].l && t[p].r<=r)
{
t[p].pre=(t[p].pre+num*(t[p].r-t[p].l+1))%mod;
t[p].add=(t[p].add+num)%mod;
return 0;
}
f(p);
long long mid=(t[p].l+t[p].r)>>1;
if(l<=mid)
add(p*2,l,mid,num);
if(r>mid)
add(p*2+1,mid+1,r,num);
t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
return 0;
}
long long mul(long long p,long long l,long long r,long long num)
{
if(l<=t[p].l && t[p].r<=r)
{
t[p].pre=t[p].pre*num%mod;
t[p].add=t[p].add*num%mod;
t[p].mul=t[p].mul*num%mod;
return 0;
}
f(p);
long long mid=(t[p].l+t[p].r)>>1;
if(l<=mid)
mul(p*2,l,mid,num);
if(r>mid)
mul(p*2+1,mid+1,r,num);
t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
return 0;
}
long long ans(long long p,long long l,long long r)
{
if(l<=t[p].l && t[p].r<=r)
return t[p].pre%mod;
f(p);
long long mid=(t[p].l+t[p].r)>>1,sum=0;
if(l<=mid)
sum=(sum+ans(p*2,l,mid))%mod;
if(r>mid)
sum=(sum+ans(p*2+1,mid+1,r))%mod;
return sum%mod;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&mod);
for(long long i=1;i<=n;i++)
scanf("%lld",a+i);
build(1,1,n);
for(long long i=1;i<=m;i++)
{
scanf("%lld",&k);
if(k==1)
{
scanf("%lld%lld%lld",&x,&y,&z);
z%=mod;
mul(1,x,y,z);
}
if(k==2)
{
scanf("%lld%lld%lld",&x,&y,&z);
z%=mod;
add(1,x,y,z);
}
if(k==3)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ans(1,x,y)%mod);
}
}
return 0;
}