#include<bits/stdc++.h>
using namespace std;
using i64=long long;
const int N=4e6+1;
i64 a[100001];
int mod;
struct fenwicktree
{
i64 l,r;
i64 sum,add,multi;
}sgt[N];
void updata(int k)
{
sgt[k].sum=(sgt[k+k].sum *sgt[k+k].multi +sgt[k+k].add *(sgt[k+k].r -sgt[k+k].l +1))%mod
+(sgt[k+k+1].sum*sgt[k+k+1].multi+sgt[k+k+1].add*(sgt[k+k+1].r-sgt[k+k+1].l+1))%mod;
}
void push_down(int k)
{
int l=sgt[k].l;
int r=sgt[k].r;
if(sgt[k].multi)
{
sgt[k].sum=(sgt[k].sum*sgt[k].multi)%mod;
sgt[k+k].multi=(sgt[k+k].multi*sgt[k].multi)%mod;
sgt[k+k+1].multi=(sgt[k+k+1].multi*sgt[k].multi)%mod;
sgt[k+k].add=(sgt[k+k].add*sgt[k].multi)%mod;
sgt[k+k+1].add=(sgt[k+k+1].add*sgt[k].multi)%mod;
sgt[k].multi=1;
}
if(sgt[k].add)
{
sgt[k].sum=(sgt[k].sum+(r-l+1)*sgt[k].add)%mod;
sgt[k+k].add=(sgt[k+k].add+sgt[k].add)%mod;
sgt[k+k+1].add=(sgt[k+k+1].add+sgt[k].add)%mod;
sgt[k].add=0;
}
}
void build(int k,int l,int r)
{
sgt[k].add=0;
sgt[k].multi=1;
sgt[k].l=l;
sgt[k].r=r;
if(l==r)
{
sgt[k].sum=a[l];
return ;
}
int m=(l+r)>>1;
build(k+k,l,m);
build(k+k+1,m+1,r);
sgt[k].sum=(sgt[k+k].sum+sgt[k+k+1].sum)%mod;
}
void add(int k,int x,int y,i64 p)
{
int l=sgt[k].l;
int r=sgt[k].r;
if(l==x&&r==y)
{
sgt[k].add+=p%mod;
return ;
}
push_down(k);
int m=(l+r)>>1;
if(y<=m)
add(k+k,x,y,p);
else if(m<x)
add(k+k+1,x,y,p);
else
add(k+k,x,m,p),add(k+k+1,m+1,y,p);
updata(k);
}
void multi(int k,int x,int y,i64 p)
{
int l=sgt[k].l;
int r=sgt[k].r;
if(l==x&&r==y)
{
sgt[k].multi=sgt[k].multi*p%mod;
sgt[k].add=sgt[k].add*p%mod;
return ;
}
push_down(k);
int m=(l+r)>>1;
if(y<=m)
multi(k+k,x,y,p);
else if(m<x)
multi(k+k+1,x,y,p);
else
multi(k+k,x,m,p),multi(k+k+1,m+1,y,p);
updata(k);
}
i64 calc(int k,int x,int y)
{
int l=sgt[k].l;
int r=sgt[k].r;
if(l==x&&r==y)
{
return (sgt[k].sum*sgt[k].multi%mod+sgt[k].add*(r-l+1))%mod;
}
push_down(k);
int m=(l+r)>>1;
if(m>=y)
return calc(k+k,x,y);
else if(m<x)
return calc(k+k+1,x,y);
else
return calc(k+k,x,m)+calc(k+k+1,m+1,y);
}
signed main()
{
int n,m;
cin>>n>>m>>mod;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=0;i<m;i++)
{
int x;
cin>>x;
if(x==1)
{
i64 x,y,z;
cin>>x>>y>>z;
multi(1,x,y,z);
}
else if(x==2)
{
i64 x,y,z;
cin>>x>>y>>z;
add(1,x,y,z);
}
else
{
i64 x,y;
cin>>x>>y;
cout<<calc(1,x,y)%mod<<endl;
}
}
}