#include<bits/stdc++.h>
#define int long long
#define mid (l+r)>>1
#define lc o<<1
#define rc o<<1|1
using namespace std;
const int maxn=1e5+10;
int n,q,mod,sum[4*maxn],tag[4*maxn],mtag[4*maxn],a[maxn],op,x,y,k;
inline void pushdown(int o,int l,int r){
int m=mid;
mtag[lc]*=mtag[o];mtag[lc]%=mod;
mtag[rc]*=mtag[o];mtag[rc]%=mod;
tag[lc]=tag[lc]*mtag[o]%mod+tag[o];tag[lc]%=mod;
tag[rc]=tag[rc]*mtag[o]%mod+tag[o];tag[rc]%=mod;
sum[lc]=mtag[o]*sum[lc]%mod+(m-l+1)*tag[o]%mod;sum[lc]%=mod;
sum[rc]=mtag[o]*sum[rc]%mod+(r-m)*tag[o]%mod;sum[rc]%=mod;
tag[o]=0;
mtag[o]=1;
}
void build(int o,int l,int r){
if(l==r){
sum[o]=a[l]%mod;
mtag[o]=1;
return;
}
int m=mid;
build(lc,l,m);
build(rc,m+1,r);
sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
mtag[o]=1;
}
void update1(int o,int l,int r){
if(x<=l&&r<=y){
tag[o]=(tag[o]+k)%mod;
sum[o]=(sum[o]+(r-l+1)*k%mod)%mod;
return;
}
pushdown(o,l,r);
int m=mid;
if(x<=m)update1(lc,l,m);
if(y>m)update1(rc,m+1,r);
sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
}
void update2(int o,int l,int r){
if(x<=l&&r<=y){
tag[o]=tag[o]*k%mod;
mtag[o]=mtag[o]*k%mod;
sum[o]=sum[o]*k%mod;
return;
}
pushdown(o,l,r);
int m=mid;
if(x<=m)update2(lc,l,m);
if(y>m)update2(rc,m+1,r);
sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
}
int query(int o,int l,int r){
if(x<=l&&r<=y){
return sum[o]%mod;
}
pushdown(o,l,r);
int m=mid,ans=0;
if(x<=m)ans+=query(lc,l,m);
if(y>m)ans+=query(rc,m+1,r);
return ans%mod;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q>>mod;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
cin>>op;
if(op==1){
cin>>x>>y>>k;
update1(1,1,n);
}else if(op==2){
cin>>x>>y>>k;
update2(1,1,n);
}else{
cin>>x>>y;
cout<<query(1,1,n)<<"\n";
}
}
return 0;
}