#include<bits/stdc++.h>
#define ll long long
#define MAXN 200005
using namespace std;
ll a1,b,c,d,e,ff,q,mm;
ll n,m,a[MAXN],ans[MAXN<<2],add[MAXN<<2],mul[MAXN<<2];
void scan()
{
cin>>n>>q>>mm;
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
}
void push_up(ll p)
{
ans[p]=ans[p*2]+ans[p*2+1];
ans[p]%=mm;
}
void build(ll p,ll l,ll r)
{
add[p]=0;mul[p]=1;
if(l==r)
{
ans[p]=a[l];
ans[p]%=mm;
return;
}
ll mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
push_up(p);
}
void f(ll p,ll l,ll r,ll ka,ll km)
{
if(ka!=0)
{
ans[p]=(ans[p]+(r-l+1)*ka%mm)%mm;
add[p]=(add[p]+ka%mm)%mm;
}
if(mul[p]!=1)
{
ans[p]=(ans[p]*(km%mm))%mm;
add[p]=(add[p]*(km%mm))%mm;
mul[p]=(mul[p]*(km%mm))%mm;
}
}
void push_down(ll p,ll l,ll r)
{
ll mid=(l+r)/2;
f(p*2,l,mid,add[p],mul[p]);
f(p*2+1,mid+1,r,add[p],mul[p]);
add[p]=0;mul[p]=1;
}
void ad(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
if(l>=nl&&r<=nr)
{
ans[p]+=((r-l+1)*k);
ans[p]%=mm;
add[p]+=k;
add[p]%=mm;
return;
}
push_down(p,l,r);
ll mid=(r+l)/2;
if(nl<=mid)ad(nl,nr,l,mid,p*2,k);
if(nr>mid)ad(nl,nr,mid+1,r,p*2+1,k);
push_up(p);
}
void mu(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
if(l>=nl&&r<=nr)
{
ans[p]=ans[p]*(k%mm)%mm;
add[p]=add[p]*(k%mm)%mm;
mul[p]=mul[p]*(k%mm)%mm;
return;
}
push_down(p,l,r);
ll mid=(r+l)/2;
if(nl<=mid)mu(nl,nr,l,mid,p*2,k);
if(nr>mid)mu(nl,nr,mid+1,r,p*2+1,k);
push_up(p);
}
ll query(ll nl,ll nr,ll l,ll r,ll p)
{
ll sum=0;
if(nl<=l&&nr>=r)return ans[p]%mm;
ll mid=(l+r)>>1;
push_down(p,l,r);
if(nl<=mid)sum+=query(nl,nr,l,mid,p*2);
if(nr>mid)sum+=query(nl,nr,mid+1,r,p*2+1);
return sum%mm;
}
int main()
{
scan();
build(1,1,n);
while(q--)
{
scanf("%lld",&a1);
switch(a1)
{
case 1:{
scanf("%lld%lld%lld",&b,&c,&d);
mu(b,c,1,n,1,d);
break;
}
case 2:{
scanf("%lld%lld%lld",&b,&c,&d);
ad(b,c,1,n,1,d);
break;
}
case 3:{
scanf("%lld%lld",&e,&ff);
printf("%lld\n",query(e,ff,1,n,1));
break;
}
}
}
return 0;
}