#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,mod,a[N];
int sum[N<<2],tag1[N<<2],tag2[N<<2];
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void push_up(int p){
sum[p]=(sum[ls(p)]+sum[rs(p)])%mod;
}
inline void build(int l,int r,int p){
tag1[p]=0,tag2[p]=1;
if(l==r){
sum[p]=a[l]%mod;
return;
}
int mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
inline void f1(int l,int r,int p,int k){
tag1[p]=(tag1[p]+k)%mod;
sum[p]=(sum[p]+(r-l+1)*k)%mod;
}
inline void f2(int l,int r,int p,int k){
tag1[p]=(tag1[p]*k)%mod;
tag2[p]=(tag2[p]*k)%mod;
sum[p]=(sum[p]*k)%mod;
}
inline void push_down1(int l,int r,int p){
int mid=(l+r)>>1;
f1(l,mid,ls(p),tag1[p]);
f1(mid+1,r,rs(p),tag1[p]);
tag1[p]=0;
}
inline void push_down2(int l,int r,int p){
int mid=(l+r)>>1;
f2(l,mid,ls(p),tag2[p]);
f2(mid+1,r,rs(p),tag2[p]);
tag2[p]=1;
}
inline void updata1(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&r<=nr){
f1(l,r,p,k);
return;
}
push_down1(l,r,p);
int mid=(l+r)>>1;
if(nl<=mid) updata1(nl,nr,l,mid,ls(p),k);
if(mid+1<=nr) updata1(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
inline void updata2(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&r<=nr){
f2(l,r,p,k);
return;
}
push_down2(l,r,p);
int mid=(l+r)>>1;
if(nl<=mid) updata2(nl,nr,l,mid,ls(p),k);
if(mid+1<=nr) updata2(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
inline int query(int nl,int nr,int l,int r,int p){
int res=0;
if(nl<=l&&r<=nr){
return sum[p];
}
push_down1(l,r,p);
push_down2(l,r,p);
int mid=(l+r)>>1;
if(nl<=mid) res=(res+query(nl,nr,l,mid,ls(p)))%mod;
if(mid+1<=nr) res=(res+query(nl,nr,mid+1,r,rs(p)))%mod;
return res%mod;
}
signed main(){
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,n,1);
for(int i=1;i<=m;i++){
int k,x,y,z;
scanf("%d",&k);
if(k==1){
scanf("%d%d%d",&x,&y,&z);
updata2(x,y,1,n,1,z);
}else if(k==2){
scanf("%d%d%d",&x,&y,&z);
updata1(x,y,1,n,1,z);
}else if(k==3){
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y,1,n,1));
}
}
return 0;
}