#include<cstdio>
using namespace std;
typedef long long ll;
ll n,m,p,a[400005],t[400005],add[400005],mul[400005];
void build(ll k,ll l,ll r)
{
mul[k]=1;
if(l==r)
{
t[k]=a[l]%p;
return ;
}
ll mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
t[k]=(t[k*2]+t[k*2+1])%p;
}
void pushdown(ll k,ll l,ll r)
{
ll mid=(l+r)/2;
t[k*2]=(t[k*2]*mul[k])%p;
t[k*2+1]=(t[k*2+1]*mul[k])%p;
t[k*2]=(t[k*2]+(mid-l+1)*add[k])%p;
t[k*2+1]=(t[k*2+1]+(r-mid)*add[k])%p;
mul[k*2]=(mul[k*2]*mul[k])%p;
mul[k*2+1]=(mul[k*2+1]*mul[k])%p;
add[k*2]=(add[k*2]+add[k])%p;
add[k*2+1]=(add[k*2+1]+add[k])%p;
add[k]=0,mul[k]=1;
}
void mul_modify(ll k,ll l,ll r,ll x,ll y,ll z)
{
if(x<=l&&y>=r)
{
t[k]=(t[k]*z)%p;
add[k]=(add[k]*z)%p;
mul[k]=(mul[k]*z)%p;
return ;
}
pushdown(k,l,r);
ll mid=(l+r)/2;
if(x<=mid) mul_modify(k*2,l,mid,x,y,z);
if(mid<y) mul_modify(k*2+1,mid+1,r,x,y,z);
t[k]=(t[k*2]+t[k*2+1])%p;
}
void add_modify(ll k,ll l,ll r,ll x,ll y,ll z)
{
if(x<=l&&y>=r)
{
t[k]=(t[k]+(r-l+1)*z)%p;
add[k]=(add[k]+z)%p;
return ;
}
pushdown(k,l,r);
ll mid=(l+r)/2;
if(x<=mid) add_modify(k*2,l,mid,x,y,z);
if(mid<y) add_modify(k*2+1,mid+1,r,x,y,z);
t[k]=(t[k*2]+t[k*2+1])%p;
}
ll query(ll k,ll l,ll r,ll x,ll y)
{
if(x<=l&&y>=r)
return t[k]%p;
pushdown(k,l,r);
ll mid=(l+r)/2,res=0;
if(x<=mid) res=(res+query(k*2,l,mid,x,y))%p;
if(mid<y) res=(res+query(k*2+1,mid+1,r,x,y))%p;
return res;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(ll i=1;i<=m;i++)
{
ll opt,x,y,z;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt==1)
{
scanf("%lld",&z);
mul_modify(1,1,n,x,y,z);
}
if(opt==2)
{
scanf("%lld",&z);
add_modify(1,1,n,x,y,z);
}
if(opt==3)
printf("%lld\n",query(1,1,n,x,y)%p);
}
return 0;
}