#include<bits/stdc++.h>
using namespace std;
long long a[1000001],b,c,d,e,n,m,k[1000001],tr[1000001],lazy[1000001],lazy1[1000001],inf=-0x3f3f3f3f,Q;
void build(long long l,long long r,long long p) {
lazy1[p]=1;
if(l==r) {
tr[p]=a[l];
return ;
}
long long mid=(l+r)/2;
build(l,mid,2*p);
build(mid+1,r,2*p+1);
tr[p]=tr[2*p]+tr[2*p+1];
return ;
}
void push_down(long long x,int l,int r) {
tr[2*x]*=lazy1[x];
tr[2*x+1]*=lazy1[x];
int mid=(l+r)/2;
tr[2*x]+=lazy[x]*(mid-l+1);
tr[2*x+1]+=lazy[x]*(r-mid);
lazy1[2*x]*=lazy1[x];
lazy1[2*x+1]*=lazy1[x];
lazy[2*x]+=lazy[x];
lazy[2*x+1]+=lazy[x];
tr[2*x]%=Q;
tr[2*x+1]%=Q;
lazy1[2*x]%=Q;
lazy1[2*x+1]%=Q;
lazy[2*x]%=Q;
lazy[2*x+1]%=Q;
lazy[x]=0;
lazy1[x]=1;
return ;
}
int check(long long l,long long r,long long s,long long t,long long x) {
if(lazy[x]||lazy1[x]) push_down(x,s,t);
// cout<<x<<" ";
// if(l==r)return tr[x]
if(r<s||l>t) return inf;
if(l<=s&&t<=r) return tr[x];
int ans=0;
int mid=(s+t)/2;
if(l<=mid) ans+=check(l,r,s,mid,x*2);
if(mid+1<=r) ans+=check(l,r,mid+1,t,x*2+1);
return ans%Q;
}
void add(long long l,long long r,long long s,long long t,long long x,long long v) {
if(r<s||t<l) return ;
if(l<=s&&t<=r) {
// cout<<s<<" "<<t<<endl;
tr[x]+=v*(s-t+1);
lazy[x]+=v;
push_down(x,s,t);
return;
}
if(lazy[x]||lazy1[x]) push_down(x,s,t);
long long mid=(s+t)/2;
if(l<=mid) add(l,r,s,mid,x*2,v);
if(mid+1<=r) add(l,r,mid+1,t,x*2+1,v);
tr[x]=tr[x*2]+tr[x*2+1];
}
void ch(long long l,long long r,long long s,long long t,long long x,long long v) {
if(lazy[x]) push_down(x,s,t);
if(r<s||t<l) return ;
if(l<=s&&t<=r) {
tr[x]*=v;
lazy1[x]*=v;
lazy[x]*=v;
push_down(x,s,t);
tr[x]%=Q;
lazy1[x]%=Q;
lazy[x]%=Q;
return;
}
long long mid=(s+t)/2;
if(l<=mid) ch(l,r,s,mid,x*2,v);
if(mid+1<=r) ch(l,r,mid+1,t,x*2+1,v);
tr[x]=tr[x*2]+tr[x*2+1];
}
int main() {
cin>>n>>m>>Q;
for(long long i=1; i<=n; i++)
cin>>a[i];
build(1,n,1);
// cin>>m;
for(long long i=1; i<=m; i++) {
cin>>b;
if(b==1) {
scanf("%lld%lld%lld",&c,&d,&e);
ch(c,d,1,n,1,e);
}
if(b==2) {
scanf("%lld%lld%lld",&c,&d,&e);
add(c,d,1,n,1,e);
}
if(b==3) {
scanf("%lld%lld",&c,&d);
cout<<check(c,d,1,n,1)<<endl;
}
}
for(int i=1; i<=n; i++) {
cout<<check(i,i,1,n,1)<<" ";
}
cout<<endl;
for(int i=1; i<=2*n-1; i++) {
cout<<tr[i]<<" ";
}
}