#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=1000010;
int n,m,mod,a[N],tag[N<<2],ans[N<<2],tx[N<<2];
inline ll ls(ll x){
return x<<1;
}
inline ll rs(ll x){
return x<<1|1;
}
inline void push_up(ll p){
ans[p]=(ans[ls(p)]+ans[rs(p)])%mod;
}
void build(ll l,ll r,ll p){
tx[p]=1;
if(l==r){
ans[p]=a[l]%mod;
return;
}
ll mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
inline void push_down(ll p,ll l,ll r){
ll mid=(l+r)>>1;ll xl=ls(p),xr=rs(p);
ans[xl]=(tx[p]*ans[xl]+((mid-l+1)*tag[p])%mod)%mod;
ans[xr]=(tx[p]*ans[xr]+((r-mid)*tag[p])%mod)%mod;
tx[xl]=(tx[xl]*tx[p])%mod;
tx[xr]=(tx[xr]*tx[p])%mod;
tag[xl]=(tag[xl]*tx[p]+tag[p])%mod;
tag[xr]=(tag[xr]*tx[p]+tag[p])%mod;
tag[p]=0;tx[p]=1;
}
void xf(ll fl,ll fr,ll l,ll r,ll p,ll k){
if(fl<=l&&fr>=r){
tag[p]=(tag[p]*k)%mod;
tx[p]=(tx[p]*k)%mod;
ans[p]=(ans[p]*k)%mod;
return;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(fl<=mid)xf(fl,fr,l,mid,ls(p),k);
if(fr>mid)xf(fl,fr,mid+1,r,rs(p),k);
push_up(p);
}
void jf(ll fl,ll fr,ll l,ll r ,ll p,ll k){
if(fl<=l&&fr>=r){
ans[p]=(ans[p]+k*(r-l+1))%mod;
tag[p]=(tag[p]+k)%mod;
return;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(fl<=mid)jf(fl,fr,l,mid,ls(p),k);
if(fr>mid)jf(fl,fr,mid+1,r,rs(p),k);
push_up(p);
}
ll prin(ll fl,ll fr,ll l,ll r,ll p){
if(fl<=l&&fr>=r)
return ans[p];
ll sum=0;
push_down(p,l,r);
ll mid=(l+r)>>1;
if(fl<=mid)sum=(sum+prin(fl,fr,l,mid,ls(p)))%mod;
if(mid<fr)sum=(sum+prin(fl,fr,mid+1,r,rs(p)))%mod;
return sum;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
if(t==1){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
xf(x,y,1,n,1,k);
}
else if(t==2){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
jf(x,y,1,n,1,k);
}
else if(t==3){
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",prin(x,y,1,n,1)%mod);
}
}
return 0;
}