#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,m;
int aa[10000009];
struct st{
int l,r;
int x;
int b1,b2;
}f[10000009];
void inite(int l,int r,int t){
f[t].x=aa[r]-aa[l-1];
f[t].l=l;
f[t].r=r;
f[t].b1=1;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
if(l==r){
return;
}
int mid;
mid=l+r;
mid/=2;
inite(l,mid,2*t);
inite(mid+1,r,2*t+1);
}
void qc(int t,int l,int r,int x){
if(l==f[t].l&&r==f[t].r){
f[t].b1*=x;
f[t].b2*=x;
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
qc(2*t,l,r,x);
}else if(l>mid){
qc(2*t+1,l,r,x);
}else{
qc(2*t,l,mid,x);
qc(2*t+1,mid+1,r,x);
}
f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(r-l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(r-l+1));
}
void qj(int t,int l,int r,int x){
if(l==f[t].l&&r==f[t].r){
f[t].b2+=x;
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
qj(2*t,l,r,x);
}else if(l>mid){
qj(2*t+1,l,r,x);
}else{
qj(2*t,l,mid,x);
qj(2*t+1,mid+1,r,x);
}
f[t].x=(f[2*t].x*f[2*t].b1+f[2*t].b2*(r-l+1))+(f[2*t+1].x*f[2*t+1].b1+f[2*t+1].b2*(r-l+1));
}
int jj(int t,int l,int r){
if(l==f[t].l&&r==f[t].r){
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
return f[t].x;
}
f[t].x=f[t].x*f[t].b1+f[t].b2*(r-l+1);
f[2*t].b1*=f[t].b1;
f[2*t].b2*=f[t].b1;
f[2*t].b2+=f[t].b2;
f[2*t+1].b1*=f[t].b1;
f[2*t+1].b2*=f[t].b1;
f[2*t+1].b2+=f[t].b2;
f[t].b1=1;
f[t].b2=0;
f[t].x%=m;
f[t].b2%=m;
f[t].b1%=m;
f[2*t].x%=m;
f[2*t].b2%=m;
f[2*t].b1%=m;
f[2*t+1].x%=m;
f[2*t+1].b2%=m;
f[2*t+1].b1%=m;
int mid;
mid=f[t].l+f[t].r;
mid/=2;
if(r<=mid){
return jj(2*t,l,r);
}else if(l>mid){
return jj(2*t+1,l,r);
}else{
return jj(2*t,l,mid)+jj(2*t+1,mid+1,r);
}
}
signed main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>aa[i];
aa[i]+=aa[i-1];
}
inite(1,n,1);
for(int i=1;i<=q;i++){
int s;
cin>>s;
if(s==1){
int x,y,k;
cin>>x>>y>>k;
qc(1,x,y,k);
}else if(s==2){
int x,y,k;
cin>>x>>y>>k;
qj(1,x,y,k);
}else{
int x,y;
cin>>x>>y;
cout<<jj(1,x,y)%m<<endl;
}
}
return 0;
}