#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll n,m,mod,dat[4*N],a[N],taga[4*N],tagm[4*N];
void build(ll p,ll l,ll r) {
tagm[p]=1;
if(l==r) {
dat[p]=a[l];
return ;
}
ll mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
void mul(ll p,ll l,ll r,ll v) {
tagm[p]=tagm[p]*v%mod;
dat[p]=dat[p]*v%mod;
}
void add(ll p,ll l,ll r,ll v) {
taga[p]=(taga[p]+v+mod)%mod;
dat[p]=(dat[p]+v*(r-l+1)+mod)%mod;
}
void pushdown(ll p,ll l,ll r) {
ll mid=(l+r)/2;
mul(p*2,l,mid,tagm[p]);
mul(p*2+1,mid+1,r,tagm[p]);
add(p*2,l,mid,taga[p]);
add(p*2+1,mid+1,r,taga[p]);
tagm[p]=1;
taga[p]=0;
}
void modify_add(ll p,ll l,ll r,ll x,ll y,ll v) {
if(x<=l&&r<=y) {
add(p,l,r,v);
return;
}
pushdown(p,l,r);
ll mid=(l+r)/2;
if(x<=mid) modify_add(p*2,l,mid,x,y,v);
if(y>mid) modify_add(p*2+1,mid+1,r,x,y,v);
dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
void modify_mul(ll p,ll l,ll r,ll x,ll y,ll v) {
if(x<=l&&r<=y) {
mul(p,l,r,v);
return;
}
pushdown(p,l,r);
ll mid=(l+r)/2;
if(x<=mid) modify_mul(p*2,l,mid,x,y,v);
if(y>mid) modify_mul(p*2+1,mid+1,r,x,y,v);
dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
ll query(ll p,ll l,ll r,ll x,ll y) {
if(x<=l&&r<=y) return dat[p]%mod;
pushdown(p,l,r);
ll mid=(l+r)/2;
ll res=0;
if(x<=mid) res+=query(p*2,l,mid,x,y);
if(y>mid) res+=query(p*2+1,mid+1,r,x,y);
return res%mod;
}
int main() {
scanf("%lld %lld %lld",&n,&m,&mod);
for(ll i=1; i<=n; i++) scanf("%lld",&a[i]);
build(1,1,n);
for(ll i=1,opt,x,y,v; i<=m; i++) {
scanf("%lld %lld %lld",&opt,&x,&y);
if(opt==1) {
scanf("%lld",&v);
modify_mul(1,1,n,x,y,v);
} else if(opt==2) {
scanf("%lld",&v);
modify_add(1,1,n,x,y,v);
} else {
printf("%lld\n",query(1,1,n,x,y)%mod);
}
}
return 0;
}