全部输出0
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+5;
ll n,m,mod;
ll a[N];
struct segment_tree
{
ll l,r,val,laz_tag_add,laz_tag_mul;
}t[N<<2];
void push_up(ll x)
{
t[x].val=(t[x<<1].val+t[x<<1|1].val)%mod;
}
void push_down(int x)
{
t[x<<1].val=(t[x<<1].val*t[x].laz_tag_mul+t[x].laz_tag_add*(t[x<<1].r-t[x<<1].l+1))%mod;
t[x<<1|1].val=(t[x<<1|1].val*t[x].laz_tag_mul+t[x].laz_tag_add*(t[x<<1|1].r-t[x<<1|1].l+1))%mod;
t[x<<1].laz_tag_mul=(t[x<<1].laz_tag_mul*t[x].laz_tag_mul)%mod;
t[x<<1|1].laz_tag_mul=(t[x<<1|1].laz_tag_mul*t[x].laz_tag_mul)%mod;
t[x<<1].laz_tag_add=(t[x<<1].laz_tag_add*t[x].laz_tag_mul+t[x].laz_tag_add)%mod;
t[x<<1|1].laz_tag_add=(t[x<<1|1].laz_tag_add*t[x].laz_tag_mul+t[x].laz_tag_add)%mod;
t[x].laz_tag_add=0;
t[x].laz_tag_mul=1;
}
inline void build(ll l,ll r,ll x)
{
t[x].l=l;
t[x].r=r;
t[x].laz_tag_mul=1;
t[x].laz_tag_add=0;
if(l==r)
{
t[x].val=a[l]%mod;
return;
}
ll mid=l+r>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
push_up(x);
}
inline void update_add(ll nl,ll nr,ll k,ll l,ll r,ll x)
{
if(nl<=l&&r<=nr)
{
t[x].val=(t[x].val+(l-r+1)*k)%mod;
t[x].laz_tag_add=(t[x].laz_tag_add+k)%mod;
return;
}
push_down(x);
ll mid=l+r>>1;
if(nl<=mid) update_add(nl,nr,k,l,mid,x<<1);
if(nr>mid) update_add(nl,nr,k,mid+1,r,x<<1|1);
push_up(x);
}
inline void update_mul(ll nl,ll nr,ll k,ll l,ll r,ll x)
{
if(nl<=l&&r<=nr)
{
t[x].val=(t[x].val*k)%mod;
t[x].laz_tag_mul=(t[x].laz_tag_mul*k)%mod;
t[x].laz_tag_add=(t[x].laz_tag_add*k)%mod;
return;
}
push_down(x);
ll mid=l+r>>1;
if(nl<=mid) update_add(nl,nr,k,l,mid,x<<1);
if(nr>mid) update_add(nl,nr,k,mid+1,r,x<<1|1);
push_up(x);
}
inline ll query(ll nl,ll nr,ll l,ll r,ll x)
{
if(nl<=l&&r<=nr)
{
return t[x].val%mod;
}
push_down(x);
ll mid=l+r>>1,ans=0;
if(nl<=mid) ans=(ans+query(nl,nr,l,mid,x<<1))%mod;
if(nr>mid) ans=(ans+query(nl,nr,mid+1,r,x<<1|1))%mod;
}
int main()
{
cin>>n>>m>>mod;
for(ll i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
while(m--)
{
ll op;
cin>>op;
if(op==1)
{
ll l,r,k;
cin>>l>>r>>k;
update_mul(l,r,k,1,n,1);
}
if(op==2)
{
ll l,r,k;
cin>>l>>r>>k;
update_add(l,r,k,1,n,1);
}
if(op==3)
{
ll l,r;
cin>>l>>r;
cout<<query(l,r,1,n,1)<<endl;
}
}
return 0;
}