#include<bits/stdc++.h>
#define int long long
using namespace std;
int b[1000086];
int n,m;
struct sb{
int sum,tag_add,tag_mul;
}a[1000086];
int mod;
void build(int w,int l,int r){
a[w].tag_mul=1;
if(l==r){
a[w].sum=b[l];
return;
}
int mid=(l+r)/2;
build(2*w,l,mid);
build(2*w+1,mid+1,r);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
}
void spread(int w,int l,int r){
if(a[w].tag_add!=0||a[w].tag_mul!=1){
int mid=(l+r)/2;
a[2*w].sum*=a[w].tag_mul%mod;a[2*w].sum%=mod;
a[2*w].sum+=(mid-l+1)*a[w].tag_add%mod;a[2*w].sum%=mod;
a[2*w].tag_add+=a[w].tag_add%mod;a[2*w].tag_add%=mod;
a[2*w].tag_mul*=a[w].tag_mul%mod;a[2*w].tag_mul%=mod;
a[2*w+1].sum*=a[w].tag_mul%mod;a[2*w+1].sum%=mod;
a[2*w+1].sum+=(r-mid)*a[w].tag_add%mod;a[2*w+1].sum%=mod;
a[2*w+1].tag_add+=a[w].tag_add%mod;a[2*w+1].tag_add%=mod;
a[2*w+1].tag_mul*=a[w].tag_mul%mod;a[2*w+1].tag_mul%=mod;
a[w].tag_add=0;
a[w].tag_mul=1;
}
}
void add(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].tag_add+=k;
a[w].sum+=(k*(r-l+1))%mod;
a[w].tag_add%=mod,a[w].sum%=mod;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)add(2*w,l,mid,ql,qr,k);
if(qr>mid)add(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].sum%=mod;
}
void mul(int w,int l,int r,int ql,int qr,int k){
if(ql<=l&&qr>=r){
a[w].tag_mul*=k;
a[w].tag_add*=k;
a[w].sum*=k;
a[w].tag_add%=mod,a[w].tag_mul%=mod,a[w].sum%=mod;
return;
}
spread(w,l,r);
int mid=(l+r)/2;
if(ql<=mid)mul(2*w,l,mid,ql,qr,k);
if(qr>mid)mul(2*w+1,mid+1,r,ql,qr,k);
a[w].sum=a[2*w].sum+a[2*w+1].sum;
a[w].sum%=mod;
}
int getsum(int w,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return a[w].sum%mod;
spread(w,l,r);
int mid=(l+r)/2;
int ans=0;
if(ql<=mid)ans+=getsum(2*w,l,mid,ql,qr)%mod;
if(qr>mid)ans+=getsum(2*w+1,mid+1,r,ql,qr)%mod;
return ans%mod;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)cin>>b[i];
build(1,1,n);
while(m--){
int opt,x,y,k;
cin>>opt>>x>>y;
if(!(opt-1)){
cin>>k;
mul(1,1,n,x,y,k);
}
else if(!(opt-2)){
cin>>k;
add(1,1,n,x,y,k);
}
else {
cout<<getsum(1,1,n,x,y)%mod<<"\n";
}
}
return 0;
}