代码
#include<iostream>
#include<cstdio>
#include<vector>
#define int long long
using namespace std;
const int maxn=1e5+10;
int n,m,mod,a[maxn];
struct node
{
int l;
int r;
int data;
int lazy;
int mul;
}t[maxn<<2];
void pushup(int p)
{
t[p].data=t[p<<1].data+t[p<<1|1].data;
}
void pushdown(int p)
{
t[p<<1].data=(t[p<<1].data*t[p].mul+t[p].lazy*(t[p<<1].r-t[p<<1].l+1))%mod;
t[p<<1|1].data=(t[p<<1|1].data*t[p].mul+t[p].lazy*(t[p<<1|1].r-t[p<<1|1].l+1))%mod;
t[p<<1].mul=(t[p<<1].mul*t[p].mul)%mod;
t[p<<1].lazy=(t[p<<1].lazy*t[p].mul+t[p].lazy)%mod;
t[p<<1|1].mul=(t[p<<1|1].mul*t[p].mul)%mod;
t[p<<1|1].lazy=(t[p<<1|1].lazy*t[p].mul+t[p].lazy)%mod;
t[p].mul=1;
t[p].lazy=0;
}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r,t[p].lazy=0,t[p].mul=1;
if(l==r)
{
t[p].data=a[l];
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void change1(int p,int l,int r,int k)
{
if(l<=t[p].l&&t[p].r<=r)
{
t[p].data=(t[p].data*k)%mod;
t[p].mul=(t[p].mul*k)%mod;
t[p].lazy=(t[p].lazy*k)%mod;
return ;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) change1(p<<1,l,r,k);
if(r>mid) change1(p<<1|1,l,r,k);
pushup(p);
}
void change2(int p,int l,int r,int d)
{
if(l<=t[p].l&&t[p].r<=r)
{
t[p].data=(t[p].data+d*(t[p].r-t[p].l+1))%mod;
t[p].lazy=(t[p].lazy+d)%mod;
return ;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) change2(p<<1,l,r,d);
if(r>mid) change2(p<<1|1,l,r,d);
pushup(p);
}
int ask(int p,int l,int r)
{
if(l<=t[p].l&&t[p].r<=r)
return t[p].data;
pushdown(p);
int mid=(t[p].l+t[p].r)>>1,ans=0;
if(l<=mid) ans=(ans+ask(p<<1,l,r))%mod;
if(r>mid) ans=(ans+ask(p<<1|1,l,r))%mod;
return ans%mod;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--)
{
int op,x,y,k;
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
change1(1,x,y,k);
}
else if(op==2)
{
cin>>k;
change2(1,x,y,k);
}
else
cout<<ask(1,x,y)<<endl;
}
return 0;
}