#include<bits/stdc++.h>
#define p1 p<<1
#define p2 (p<<1)+1
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,a[N],t[N<<2],op,mod,f1[N<<2],f2[N<<2];
void build(int l,int r,int p)
{
if(l==r)
{
t[p]=a[l];
t[p]%=mod;
return ;
}
int mid=l+( (r-l) >>1);
build(l,mid,p1),build(mid+1,r,p2);
t[p]=(t[p1]+t[p2])%mod;
}
void upd(int l,int r,int x,int y,int z,int p)
{
if(l<=x && y<=r)
{
if(op==1)
{
f1[p]*=z;
t[p]*=z%mod;
t[p]%=mod;
}else{
f2[p]+=z;
t[p]+=( (y-x+1)*z )%mod;
t[p]%=mod;
}
return ;
}
int mid=x+( (y-x) >>1);
if(f1[p]>1 && x!=y)
{
t[p1]*=f1[p],t[p2]*=f1[p];
t[p1]%=mod,t[p2]%=mod;
f1[p1]*=f1[p],f1[p2]*=f1[p];
f2[p1]*=f1[p],f2[p2]*=f1[p];
f1[p1]%=mod,f2[p2]%=mod;
f2[p1]%=mod,f2[p2]%=mod;
f1[p]=1;
}
if(f2[p] && x!=y)
{
t[p1]+=( f2[p]*(mid-x+1) )%mod,t[p2]+=( f2[p]*(y-mid) )%mod;
t[p1]%=mod,t[p2]%=mod;
f2[p1]+=f2[p],f2[p2]+=f2[p];
f2[p1]%=mod,f2[p2]%=mod;
f2[p]=0;
}
if(l<=mid) upd(l,r,x,mid,z,p1);
if(r>mid) upd(l,r,mid+1,y,z,p2);
t[p]=(t[p1]+t[p2])%mod;
}
int find(int l,int r,int x,int y,int p)
{
if(l<=x && y<=r) return t[p];
int mid=x+( (y-x) >>1);
if(f1[p]>1)
{
t[p1]*=f1[p],t[p2]*=f1[p];
t[p1]%=mod,t[p2]%=mod;
f1[p1]*=f1[p],f1[p2]*=f1[p];
f2[p1]*=f1[p],f2[p2]*=f1[p];
f1[p1]%=mod,f2[p2]%=mod;
f2[p1]%=mod,f2[p2]%=mod;
f1[p]=1;
}
if(f2[p])
{
t[p1]+=( f2[p]*(mid-x+1) )%mod,t[p2]+=( f2[p]*(y-mid) )%mod;
t[p1]%=mod,t[p2]%=mod;
f2[p1]+=f2[p],f2[p2]+=f2[p];
f2[p1]%=mod,f2[p2]%=mod;
f2[p]=0;
}
int sum=0;
if(l<=mid) sum+=( find(l,r,x,mid,p1) )%mod,sum%=mod;
if(r>mid) sum+=( find(l,r,mid+1,y,p2) )%mod,sum%=mod;
t[p]=(t[p1]+t[p2])%mod;
return sum%mod;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=(n<<2);i++) f1[i]=1;
build(1,n,1);
while(m--)
{
scanf("%lld",&op);
int x,y,z;
scanf("%lld%lld",&x,&y);
if(op==1)
{
scanf("%lld",&z);
upd(x,y,1,n,z,1);
}else if(op==2)
{
scanf("%lld",&z);
upd(x,y,1,n,z,1);
}else if(op==3)
{
printf("%lld\n",find(x,y,1,n,1));
}
}
}