#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m,p,a[N];
struct hhh
{
int ans,l,r,mid,lz1,lz2;
} v[4*N];
void pushup(int x)
{
v[x].ans=v[2*x].ans+v[2*x+1].ans;
v[x].ans%=p;
}
void build(int x,int s,int t)
{
v[x].l=s; v[x].r=t; v[x].mid=s+t>>1;
if(s==t)
{
v[x].l=s; v[x].r=s;
v[x].ans=a[s];
return ;
}
build(2*x,s,v[x].mid);
build(2*x+1,v[x].mid+1,t);
pushup(x);
}
void pushdown(int x)
{
if(v[x].lz1)
{
v[2*x].lz1+=v[x].lz1;v[2*x+1].lz1+=v[x].lz1;
v[2*x].ans+=v[2*x].lz1*(v[2*x].r-v[2*x].l+1); v[2*x].ans%=p;
v[2*x+1].ans+=v[2*x+1].lz1*(v[2*x+1].r-v[2*x+1].l+1); v[2*x+1].ans%=p;
v[x].lz1=0;
}
if(v[x].lz2!=1)
{
v[2*x].lz2*=v[x].lz2; v[2*x].lz2*=v[x].lz2;
v[2*x].ans*=v[x].lz2; v[2*x].ans%=p;
v[2*x+1].ans*=v[x].lz2;v[2*x+1].ans%=p;
v[x].lz2=1;
}
}
void add(int x,int s,int t,int k)
{
if(v[x].l>=s&&v[x].r<=t)
{
v[x].lz1+=k;
v[x].ans+=v[x].lz1*(v[x].r-v[x].l+1);
v[x].ans%=p;
return ;
}
pushdown(x);
if(v[x].mid>=s) add(2*x,s,t,k);
if(v[x].mid<t) add(2*x+1,s,t,k);
pushup(x);
}
void cheng(int x,int s,int t,int k)
{
if(v[x].l>=s&&v[x].r<=t)
{
v[x].lz2*=k;
v[x].ans*=k;
v[x].ans%=p;
return ;
}
pushdown(x);
if(v[x].mid>=s) cheng(2*x,s,t,k);
if(v[x].mid<t) cheng(2*x+1,s,t,k);
pushup(x);
}
int q(int x,int s,int t)
{
if(v[x].l>=s&&v[x].r<=t)
{
return v[x].ans;
}
pushdown(x);
int sum=0;
if(v[x].mid>=s) sum+=q(2*x,s,t);
if(v[x].mid<t) sum+=q(2*x+1,s,t);
sum%=p;
return sum;
}
int main()
{
int i,j,op,x,y,k;
cin>>n>>m>>p;
for(i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(i=1;i<=4*n;i++) v[i].lz2=1;
for(i=1;i<=m;i++)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
cheng(1,x,y,k);
for(j=1;j<=n;j++)
{
cout<<q(1,j,j)<<" ";
}
cout<<'\n';
}
if(op==2)
{
cin>>x>>y>>k;
add(1,x,y,k);
for(j=1;j<=n;j++)
{
cout<<q(1,j,j)<<" ";
}
cout<<'\n';
}
if(op==3)
{
cin>>x>>y;
for(j=1;j<=n;j++)
{
cout<<q(1,j,j)<<" ";
}
cout<<'\n';
}
}
return 0;
}