#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Dian{
int v,l,r,e,e2=1;
}ts[811111];
int n,m,M,op,x,y,k,a[111111];
int Initt(int l,int r,int I){
ts[I].l=l,ts[I].r=r;
if(l==r){
ts[I].v=a[l];
return ts[I].v;
}
int mid=(l+r)/2;
ts[I].v+=Initt(l,mid,I*2);
ts[I].v+=Initt(mid+1,r,I*2+1);
return ts[I].v;
}
void DownL(int w){
ts[w*2].e+=ts[w].e;
ts[w*2].v+=ts[w].e*(ts[w*2].r-ts[w*2].l+1);
ts[w*2+1].e+=ts[w].e;
ts[w*2+1].v+=ts[w].e*(ts[w*2+1].r-ts[w*2+1].l+1);
ts[w].e=0;
ts[w*2].e2*=ts[w].e2;
ts[w*2].v*=ts[w].e2;
ts[w*2+1].e2*=ts[w].e2;
ts[w*2+1].v*=ts[w].e2;
ts[w].e2=1;
}
void Print(int x){
int l=ts[x].l,r=ts[x].r;
for(int i=1;i<l;i++){
cout<<" ";
}
cout<<"|";
if(l==r){
cout<<"\n";
return;
}
for(int i=l+1;i<r;i++){
cout<<"_";
}
cout<<"| ("<<l<<","<<r<<")\n";
}
void cg(int w,int l,int r,int k){
int L=ts[w].r-ts[w].l+1;
if(ts[w].l>=l&&ts[w].r<=r){
ts[w].v+=L*k;
ts[w].e+=k;
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
}
else if(!(ts[w].l>r||ts[w].r<l)){
DownL(w);
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
cg(w*2,l,r,k);
cg(w*2+1,l,r,k);
ts[w].v=ts[w*2].v+ts[w*2+1].v;
}
}
void cg2(int w,int l,int r,int k){
int L=ts[w].r-ts[w].l+1;
if(ts[w].l>=l&&ts[w].r<=r){
ts[w].v*=k;
ts[w].e2*=k;
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
}
else if(!(ts[w].l>r||ts[w].r<l)){
DownL(w);
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
cg2(w*2,l,r,k);
cg2(w*2+1,l,r,k);
ts[w].v=ts[w*2].v+ts[w*2+1].v;
}
}
int fd(int w,int l,int r){
int ans=0,L=ts[w].r-ts[w].l+1;
if(ts[w].l>=l&&ts[w].r<=r){
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
return ts[w].v;
}
else if(!(ts[w].l>r||ts[w].r<l)){
DownL(w);
ts[w*2+1].v%=M;
ts[w*2].v%=M;
ts[w].v%=M;
ans+=fd(w*2,l,r);
ans%=M;
ans+=fd(w*2+1,l,r);
ans%=M;
ts[w].v=ts[w*2].v+ts[w*2+1].v;
}
return ans;
}
void PP(){
cout<<"PRINT:";
for(int i=1;i<n;i++){
cout<<fd(1,i,i)<<",";
}
cout<<fd(1,n,n)<<endl;
}
signed main(){
cin>>n>>m>>M;
for(int i=1;i<=n;i++){
cin>>a[i];
}
Initt(1,n,1);
for(int i=1;i<=m;i++){
cin>>op;
if(op==1){
cin>>x>>y>>k;
cg2(1,x,y,k);
}
else if(op==2){
cin>>x>>y>>k;
cg(1,x,y,k);
}
else{
cin>>x>>y;
cout<<fd(1,x,y)%M<<endl;
}
}
}