P3373
#include<iostream>
using namespace std;
long long n,q,rt,tot,mod;
const long long maxn=1e5+10;
struct node
{
long long lson,rson;
long long add,mul;
long long sum;
}t[4*maxn];
long long a[100010];
void push_up(long long p)
{
t[p].sum=t[t[p].lson].sum%mod+t[t[p].rson].sum%mod;
t[p].sum%=mod;
}
void push_tag(long long &p,long long l,long long r,long long d,long long k)
{
if(!p)p=++tot;
if(k==2)
{
t[p].add=(t[p].add+d)%mod;
t[p].sum=((t[p].sum)%mod+((r-l+1)*d)%mod)%mod;
}
else if(k==1)
{
t[p].mul=(t[p].mul*d)%mod;
t[p].add=(t[p].add*d)%mod;
t[p].sum=(t[p].sum*d)%mod;
}
}
void push_down(long long p,long long l,long long r)
{
if(t[p].mul!=1||t[p].add!=0)
{long long mid=(l+r)>>1;
t[t[p].lson].sum=((t[t[p].lson].sum*t[p].mul)%mod+((mid-l+1)*t[p].add)%mod)%mod;
t[t[p].rson].sum=((t[t[p].rson].sum*t[p].mul)%mod+((r-(mid+1)+1)*t[p].add)%mod)%mod;
t[t[p].lson].mul=(t[t[p].lson].mul*t[p].mul)%mod;
t[t[p].rson].mul=(t[t[p].rson].mul*t[p].mul)%mod;
t[t[p].lson].add=((t[t[p].lson].add*t[p].mul)%mod+t[p].add%p)%mod;
t[t[p].rson].add=((t[t[p].rson].add*t[p].mul)%mod+t[p].add%p)%mod;
t[p].add=0,t[p].mul=1;
}
}
void build(long long &p,long long l,long long r)
{
if(!p)p=++tot;
t[p].add=0,t[p].mul=1;
if(l==r)
{
t[p].sum=a[l]%mod;
return ;
}
long long mid=(l+r)>>1;
build(t[p].lson,l,mid);
build(t[p].rson,mid+1,r);
push_up(p);
}
void change(long long &p,long long l,long long r,long long L,long long R,long long d)
{
if(!p)p=++tot;
if(L<=l&&r<=R)
{
push_tag(p,l,r,d,2);
return ;
}
push_down(p,l,r);
long long mid=(l+r)>>1;
if(L<=mid)change(t[p].lson,l,mid,L,R,d);
if(R>mid)change(t[p].rson,mid+1,r,L,R,d);
push_up(p);
}
void change_mul(long long &p,long long l,long long r,long long L,long long R,long long d)
{
if(!p)p=++tot;
if(L<=l&&r<=R)
{
push_tag(p,l,r,d,1);
return ;
}
push_down(p,l,r);
long long mid=(l+r)>>1;
if(L<=mid)change_mul(t[p].lson,l,mid,L,R,d);
if(R>mid)change_mul(t[p].rson,mid+1,r,L,R,d);
push_up(p);
}
long long ask(long long p,long long l,long long r,long long L,long long R)
{
if(L<=l&&r<=R)
{
return t[p].sum;
}
push_down(p,l,r);
long long mid=(l+r)>>1;
long long res=0;
if(L<=mid)res+=ask(t[p].lson,l,mid,L,R)%mod;
if(R>mid)res+=ask(t[p].rson,mid+1,r,L,R)%mod;
return res%mod;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>q>>mod;
for(long long i=1;i<=n;i++) cin>>a[i];
build(rt,1,n);
while(q--)
{
long long ch;
cin>>ch;
if(ch==1)
{
long long l,r,d;
cin>>l>>r>>d;
change_mul(rt,1,n,l,r,d);
}
else if(ch==2)
{
long long l,r,d;
cin>>l>>r>>d;
change(rt,1,n,l,r,d);
}
else
{
long long l,r;
cin>>l>>r;
cout<<ask(rt,1,n,l,r)<<endl;
}
}
return 0;
}