#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=100010,plus=0,mul=1;
int a[MAXN],b[4*MAXN],m[4*MAXN],tree[4*MAXN],Mod=531373,n,k;
inline int lc(int node) {return node<<1;}
inline int rc(int node) {return node<<1|1;}
void build(int l,int r,int p)
{
if(l==r) {tree[p]=a[l]%Mod;return;}
int m=l+((r-l)>>1);
build(l,m,lc(p)),build(m+1,r,rc(p));
tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
inline void push_down(int p,int s,int t)
{
if(m[p]!=1&&m[p])
{
tree[lc(p)]*=m[p],tree[lc(p)]%=Mod,tree[rc(p)]*=m[p],tree[rc(p)]%=Mod;
m[lc(p)]*=m[p],m[rc(p)]*=m[p],m[lc(p)]%=Mod,m[rc(p)]%=Mod;
}
int mid=s+((t-s)>>1);
b[p]*=m[p],m[p]=1;
tree[lc(p)]+=b[p]*(mid-s+1),tree[lc(p)]%=Mod,tree[rc(p)]+=b[p]*(t-mid),tree[rc(p)]%=Mod;
b[lc(p)]+=b[p],b[rc(p)]+=b[p],b[lc(p)]%=Mod,b[rc(p)]%=Mod;
b[p]=0;
return;
}
int getsum(int l,int r,int s,int t,int p)
{
if(l<=s&&r>=t) return tree[p];
int m=s+((t-s)>>1),sum=0;
push_down(p,s,t);
if(l<=m) sum+=getsum(l,r,s,m,lc(p))%Mod;
if(r>m) sum+=getsum(l,r,m+1,t,rc(p))%Mod;
return sum%Mod;
}
void update(int l,int r,int c,int s,int t,int p)
{
if(l<=s&&r>=t)
{
tree[p]+=(t-s+1)*c,b[p]+=c;
tree[p]%=Mod,b[p]%=Mod;
return;
}
int m=s+((t-s)>>1);
push_down(p,s,t);
if(l<=m) update(l,r,c,s,m,lc(p));
if(r>m) update(l,r,c,m+1,t,rc(p));
tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
void update_mul(int l,int r,int c,int s,int t,int p)
{
b[p]*=c;
if(l<=s&&r>=t)
{
if(m[p]==0) m[p]=1;
tree[p]*=c,m[p]*=c,m[p]%=Mod,tree[p]%=Mod;
return;
}
int mid=s+((t-s)>>1);
push_down(p,s,t);
if(l<=mid) update_mul(l,r,c,s,mid,lc(p));
if(r>mid) update_mul(l,r,c,mid+1,t,rc(p));
tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
inline void ptre()
{
cout<<"\n";
for(int i=0;i<20;i++) cout<<tree[i]<<" ";
cout<<"\n";
}
void printlist()
{
for(int i=0;i<n;i++) cout<<getsum(i,i,1,n,1)<<" ";
cout<<"\n";
}
signed main()
{
for(int i=0;i<4*MAXN-10;i++) m[i]=1;
cin>>n>>k>>Mod;
for(int i=1;i<=n;i++) cin>>a[i],a[i]%=Mod;
build(1,n,1);
ptre();
for(int i=0;i<k;i++)
{
int q,b,c,d;
cin>>q;
if(q==1) cin>>b>>c>>d,update_mul(b,c,d,1,n,1),cout<<"\nmul:["<<b<<","<<c<<"] *"<<d<<"\ntree:",ptre();
if(q==2) cin>>b>>c>>d,update(b,c,d,1,n,1),cout<<"\nplus:["<<b<<","<<c<<"] +"<<d<<"\ntree:",ptre();
if(q==3) cin>>b>>c,cout<<"\nsum:["<<b<<","<<c<<"]:"<<getsum(b,c,1,n,1)%Mod<<"\n";
}
}