没找到问题QAQ
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define ll long long
using namespace std;
struct tree
{
ll val,lazy1,lazy2;// lazy1 +; lazy2 *
}e[500005];
ll a[100005];
ll n,m,mod;
ll read()
{
ll x=0,fu=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') fu=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*fu;
}
ll ls(ll p)
{
return p<<1;
}
ll rs(ll p)
{
return p<<1|1;
}
void pushup(ll p)
{
e[p].val=(e[ls(p)].val+e[rs(p)].val)%mod;
return;
}
void pushdown(ll p,ll x,ll y)
{
ll mid=(x+y)>>1,k1=e[p].lazy1,k2=e[p].lazy2;
e[ls(p)].val=(e[ls(p)].val*k2+k1*(mid-x+1))%mod;
e[ls(p)].lazy1=(e[ls(p)].lazy1*k2+k1)%mod; e[ls(p)].lazy2=(k2*e[ls(p)].lazy2)%mod;
e[rs(p)].val=(e[rs(p)].val*k2+k1*(y-mid))%mod;
e[rs(p)].lazy1=(e[rs(p)].lazy1*k2+k1)%mod; e[rs(p)].lazy2=(k2*e[rs(p)].lazy2)%mod;
e[p].lazy1=0; e[p].lazy2=1;
return;
}
void creat(ll p,ll x,ll y)
{
if(x>=y)
{
e[p].val=a[y];
e[p].lazy1=0; e[p].lazy2=1;
return;
}
int mid=(x+y)>>1;
creat(ls(p),x,mid); creat(rs(p),mid+1,y);
pushup(p);
}
void updateadd(ll el,ll er,ll x,ll y,ll p,ll k)
{
if(el<=x&&y<=er)
{
e[p].val=(e[p].val+k*(y-x+1))%mod;
e[p].lazy1=(k+e[p].lazy1)%mod;
return;
}
pushdown(p,x,y);
ll mid=(x+y)>>1;
if(el<=mid) updateadd(el,er,x,mid,ls(p),k);
if(er>mid) updateadd(el,er,mid+1,y,rs(p),k);
pushup(p);
}
void updatemul(ll el,ll er,ll x,ll y,ll p,ll k)
{
if(el<=x&&y<=er)
{
e[p].val=(k*e[p].val)%mod;
e[p].lazy1=(k*e[p].lazy1)%mod;
e[p].lazy2=(k*e[p].lazy2)%mod;
return;
}
pushdown(p,x,y);
ll mid=(x+y)>>1;
if(el<=mid) updatemul(el,er,x,mid,ls(p),k);
if(er>mid) updatemul(el,er,mid+1,y,rs(p),k);
pushup(p);
}
ll query(ll el,ll er,ll x,ll y,ll p)
{
if(el<=x&&y<=er)
return e[p].val%mod;
pushdown(p,x,y);
ll mid=(x+y)>>1,sum=0;
if(el<=mid) sum=(sum+query(el,er,x,mid,ls(p)))%mod;
if(er>mid) sum=(sum+query(el,er,mid+1,y,rs(p)))%mod;
return sum;
}
int main()
{
n=read(); m=read(); mod=read();
for(int i=1;i<=n;++i)
a[i]=read();
creat(1,1,n);
for(int i=1;i<=m;++i)
{
ll book=read(),x=read(),y=read();
if(book==3)
printf("%lld\n",query(x,y,1,n,1));
if(book==2)
{
ll k=read();
updateadd(x,y,1,n,1,k);
}
if(book==1)
{
ll k=read();
updatemul(x,y,1,n,1,k);
}
}
return 0;
}