#include<bits/stdc++.h>
using namespace std;
const int N=1e6+3;
#define int long long
int a[N],d[N],c[N],b[N];
int mod;
void build(int s,int t,int p){
c[p]=1;
if(s==t){
d[p]=a[s];return;
}
int mid=(s+t)>>1;
build(s,mid,p*2);build(mid+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
void push_down(int s,int t,int p){
int mid=(s+t)>>1;
if(c[p]!=1){
c[p*2]*=c[p];c[p*2]%=mod;
c[p*2+1]*=c[p];c[p*2+1]%=mod;
b[p*2]*=c[p];b[p*2]%=mod;
b[p*2+1]*=c[p];b[p*2+1]%=mod;
d[p*2]*=c[p];d[p*2]%=mod;
d[p*2+1]*=c[p];d[p*2+1]%=mod;
c[p]=1;
}
if(b[p]){
d[p*2]+=b[p]*(mid-s+1);d[p*2]%=mod;
d[p*2+1]+=b[p]*(t-mid);d[p*2]%=mod;
b[p*2]+=b[p];b[p*2]%=mod;
b[p*2+1]+=b[p];b[p*2+1]%=mod;
b[p]=0;
}
}
void update1(int l,int r,int s,int t,int p,int k){
if(l<=s&&t<=r){
d[p]+=(s-t+1)*k;d[p]%=mod;
b[p]+=k;b[p]%=mod;
return;
}
int mid=(s+t)>>1;
push_down(s,t,p);
if(l<=mid)update1(l,r,s,mid,p*2,k);
if(r>mid)update1(l,r,mid+1,t,p*2+1,k);
d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
void update2(int l,int r,int s,int t,int p,int k){
if(l<=s&&t<=r){
c[p]*=k;c[p]%=mod;
b[p]*=k;b[p]%=mod;
d[p]*=k;d[p]%=mod;
return;
}
int mid=(s+t)>>1;
push_down(s,t,p);
if(l<=mid)update2(l,r,s,mid,p*2,k);
if(r>mid)update2(l,r,mid+1,t,p*2+1,k);
d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
int getsum(int l,int r,int s,int t,int p){
if(l<=s&&r>=t){
return d[p];
}
int mid=(s+t)>>1;
push_down(s,t,p);
int ans=0;
if(l<=mid)ans+=getsum(l,r,s,mid,p*2),ans%=mod;
if(r>mid)ans+=getsum(l,r,mid+1,t,p*2+1),ans%=mod;
return ans;
}
signed main(){
int n,m,op,x,y,k;
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
while(m--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
update2(x,y,1,n,1,k);
}
else{
if(op==2){
cin>>k;
update1(x,y,1,n,1,k);
}else{
cout<<getsum(x,y,1,n,1)<<endl;
}
}
}
return 0;
}