#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=k+1;++i)
using namespace std;
typedef long long ll;
const int N=700007;
ll root,cnt;
ll lc[N],rc[N],sum[N];
ll mul[N],add[N];
ll m,n,mod;
inline void read(ll &x)
{
x=0;int w=0;
register char ch=getchar();
while(ch>'9'||ch<'0'){w|=ch=='-';ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch&15);ch=getchar();}
w? x=~(x-1):x;
}
inline void spread(int p,int l,int r)
{
if(!lc[p]) lc[p]=++cnt;
if(!rc[p]) rc[p]=++cnt;
int mid=(l+r)>>1;
sum[lc[p]]=(sum[lc[p]]*mul[p]%mod+(add[p]*(mid-l+1))%mod )%mod;
sum[rc[p]]=(sum[rc[p]]*mul[p]%mod+(add[p]*(r-mid))%mod )%mod;
mul[lc[p]]=(mul[lc[p]]*mul[p])%mod;
mul[rc[p]]=(mul[rc[p]]*mul[p])%mod;
add[lc[p]]=(add[lc[p]]+add[p])%mod;
add[rc[p]]=(add[rc[p]]+add[p])%mod;
mul[p]=1;
add[p]=0;
}
inline void insertadd(ll &p,int L,int R,int ll,int rr,int v)
{
if(!p) p=++cnt;
if(ll<=L&&rr>=R)
{
sum[p]+=(R-L+1)*v%mod;
add[p]=(add[p]+v)%mod;
return;
}
spread(p,L,R);
int mid=(L+R)>>1;
if(ll<=mid) insertadd(lc[p],L,mid,ll,rr,v);
if(rr>mid) insertadd(rc[p],mid+1,R,ll,rr,v);
sum[p]=sum[lc[p]]+sum[rc[p]];
}
inline void insertmul(ll &p,int L,int R,int ll,int rr,int v)
{
if(!p) p=++cnt;
if(ll<=L&&rr>=R)
{
sum[p]=(sum[p]*v)%mod;
mul[p]=(mul[p]*v)%mod;
add[p]=(add[p]*v)%mod;
return ;
}
spread(p,L,R);
int mid=(L+R)>>1;
if(ll<=mid) insertmul(lc[p],L,mid,ll,rr,v);
if(rr>mid) insertmul(rc[p],mid+1,R,ll,rr,v);
sum[p]=sum[lc[p]]+sum[rc[p]];
}
inline ll ask(int p,int L,int R,int ll,int rr)
{
if(!p) return 0;
if(ll<=L&&rr>=R)
{
return sum[p];
}
spread(p,L,R);
long long val=0;
int mid=(L+R)>>1;
if(ll<=mid) val=(val+ask(lc[p],L,mid,ll,rr))%mod;
if(rr>mid) val=(val+ask(rc[p],mid+1,R,ll,rr))%mod;
return val%mod;
}
ll x,y,z,k;
int main()
{
// freopen("1,in","r",stdin);
// freopen("2.out","w",stdout);
read(n);read(m);read(mod);
rep(i,1,n) mul[i]=1;
rep(i,1,n)
{
read(x);
x%=mod;
insertadd(root,1,n,i,i,x);
}
for(int i=1;i<=m;++i)
{
read(x);
if(x==1)
{
read(y);read(z);read(k);
insertmul(root,1,n,y,z,k);
}
if(x==2)
{
read(y);read(z);read(k);
insertadd(root,1,n,y,z,k);
}
if(x==3) {
read(y);read(z);
cout<<ask(root,1,n,y,z)%mod<<endl;
}
}
}