RT
#include<bits/stdc++.h>
using namespace std;
long long n,m,number[100001],mod;
struct node{
long long l,r,sum,lazymul,la;
}a[100001];
void build(long long k,long long l,long long r){
a[k].l=l;
a[k].r=r;
a[k].lazymul=1;
if(l==r) a[k].sum=number[k];
long long mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
a[k].sum=a[k*2].sum+a[k*2+1].sum;
}
void pushdown(long long k){
a[k*2].sum=(a[k].lazymul*a[k*2].sum+(a[k*2].r-a[k*2].l+1)*a[k].la%mod)%mod;
a[k*2+1].sum=(a[k].lazymul*a[k*2+1].sum+(a[k*2+1].r-a[k*2+1].l+1)*a[k].la%mod)%mod;
a[k*2].lazymul=(a[k*2].lazymul*a[k].lazymul%mod);
a[k*2+1].lazymul=a[k*2+1].lazymul*a[k].lazymul%mod;
a[k*2].la=(a[k*2].la*a[k].lazymul+a[k].la)%mod;
a[k*2+1].la=(a[k*2+1].la*a[k].lazymul+a[k].lazymul)%mod;
a[k].lazymul=1;
a[k].la=0;
}
void changeSegment(long long k,long long l,long long r,long long x){
if(a[k].l>=l && a[k].r>=r){
a[k].la=(a[k].la+x)%mod;
a[k].sum=(a[k].sum+x*(a[k].r-a[k].l+1))%mod;
return;
}
pushdown(k);
a[k].sum=(a[k*2].sum+a[k*2+1].sum)%mod;
long long mid=(a[k].l+a[k].r)/2;
if(l<=mid){
changeSegment(k*2,l,r,x);
}
if(mid<r){
changeSegment(k*2+1,l,r,x);
}
a[k].sum=(a[k*2].sum+a[k*2+1].sum)%mod;
}
void mul(long long k,long long l,long long r,long long x){
if(a[k].l>=l && a[k].r<=r){
a[k].la=(a[k].la*x)%mod;
a[k].lazymul=(a[k].lazymul*x)%mod;
a[k].sum=(a[k].sum*x)%mod;
}
pushdown(k);
a[k].sum=a[k*2].sum+a[k*2+1].sum;
long long mid=(a[k].l+a[k].r)/2;
if(l<=mid){
mul(k*2,l,r,x);
}
if(mid<r){
mul(k*2+1,l,r,x);
}
a[k].sum=(a[k*2].sum+a[k*2+1].sum%mod);
}
long long query(long long k,long long l,long long r){
if(a[k].l>=l&&a[k].r<=r){
return a[k].sum;
}
pushdown(k);
long long popi=0;
long long mid=(a[k].l+a[k].r)/2;
if(l<=mid){
popi=(popi+query(k*2,l,r))%mod;
}
if(mid<r){
popi=(popi+query(k*2+1,l,r))%mod;
}
return popi;
}
int main(){
cin>>n>>m>>mod;
for(long long i=1;i<n;i++){
cin>>number[i];
}
build(1,1,n);
for(long long i=0;i<m;i++){
int q;
cin>>q;
if(q==1){
long long w,e,t;
cin>>w>>e>>t;
mul(1,w,e,t);
}else if(q==2){
long long w,e,t;
cin>>w>>e>>t;
changeSegment(1,w,e,t);
}else{
long long w,e;
cin>>w>>e;
cout<<query(1,w,e);
}
}
return 0;
}