#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,mod,f[414514],lzy[414514],g[414514],a[414514],lzt[414514];
void build (ll p,ll l,ll r){
lzt[p]=1;
lzy[p]=0;
if(l==r){
f[p]=a[l]%mod;
return ;
}
ll mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
void lt(ll p,ll x,ll y,ll len){
lzy[p]+=x;
lzy[p]%=mod;
lzt[p]*=y;
lzt[p]%=mod;
f[p]=(f[p]*y+x*len)%mod;
}
void pushdown(ll p,ll l,ll r){
ll mid=(l+r)>>1;
lt(p<<1,lzy[p],lzt[p],mid-l+1);
lt(p<<1|1,lzy[p],lzt[p],r-mid);
lzy[p]=0;
lzt[p]=1;
}
void update1(ll p,ll l,ll r,ll le,ll ri,ll x){
if(ri>=r&&le<=l){
lt(p,x,1,r-l+1);
return ;
}
pushdown(p,l,r);
ll mid=(l+r)>>1;
if(mid>=le)update1(p<<1,l,mid,le,ri,x);
if(mid<ri)update1(p<<1|1,mid+1,r,le,ri,x);
f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
void update2(ll p,ll l,ll r,ll le,ll ri,ll x){
if(ri>=r&&le<=l){
lt(p,0,x,r-l+1);
return ;
}
pushdown(p,l,r);
ll mid=(l+r)>>1;
if(mid>=le)update2(p<<1,l,mid,le,ri,x);
if(mid<ri)update2(p<<1|1,mid+1,r,le,ri,x);
f[p]=(f[p<<1]+f[p<<1|1])%mod;
}
ll ask(ll p,ll l,ll r,ll le,ll ri){
if(ri>=r&&le<=l)return f[p];
pushdown(p,l,r);
ll mid=(l+r)>>1;
ll ans=0;
if(mid>=le)ans+=ask(p<<1,l,mid,le,ri)%mod;
if(mid<ri)ans+=ask(p<<1|1,mid+1,r,le,ri)%mod;
return ans;
}
int main(){
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
ll c,l,r,x;
cin>>c>>l>>r;
if(c==2){
cin>>x;
update1(1,1,n,l,r,x);
}
if(c==1){
cin>>x;
update2(1,1,n,l,r,x);
}
if(c==3){
cout<<ask(1,1,n,l,r)%mod<<endl;
}
}
return 0;
}