#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int B=100005;
int n,q,m,a[B],sum[4*B],bk_mul[4*B],bk_add[4*B];
void build(int k,int l,int r){
bk_mul[k]=1;
bk_add[k]=0;
if(l==r){
sum[k]=a[l];
return ;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
sum[k]=sum[k*2]+sum[k*2+1];
return ;
}
void pushdown_add(int k,int l,int r){
if(bk_add[k]){
int mid=(l+r)/2,lt=k*2,rt=k*2+1;
bk_add[lt]=(bk_add[lt]%m+bk_add[k]%m)%m;
bk_add[rt]=(bk_add[rt]%m+bk_add[k]%m)%m;
sum[lt]=(sum[lt]%m+bk_add[k]%m*(mid-l+1)%m)%m;
sum[rt]=(sum[rt]%m+bk_add[k]%m*(r-(mid+1)+1)%m)%m;
bk_add[k]=0;
return ;
}
}
void pushdown_mul(int k,int l,int r){
if(bk_mul[k]!=1){
int lt=k*2,rt=k*2+1;
bk_mul[lt]=(bk_mul[lt]*bk_mul[k])%m;
bk_mul[rt]=(bk_mul[rt]*bk_mul[k])%m;
bk_add[lt]=(bk_add[lt]*bk_mul[k])%m;
bk_add[rt]=(bk_add[rt]*bk_mul[k])%m;
sum[lt]=(sum[lt]*bk_mul[k])%m;
sum[rt]=(sum[rt]*bk_mul[k])%m;
bk_mul[k]=1;
return ;
}
}
void change_add(int k,int l,int r,int x,int y,int v){
if(r<x||l>y){
return ;
}
if(x<=l&&r<=y){
sum[k]+=v*(r-l+1)%m;
bk_add[k]+=v;
return ;
}
pushdown_mul(k,l,r);
pushdown_add(k,l,r);
int mid=(l+r)/2;
change_add(k*2,l,mid,x,y,v);
change_add(k*2+1,mid+1,r,x,y,v);
sum[k]=sum[k*2]+sum[k*2+1];
return ;
}
void change_mul(int k,int l,int r,int x,int y,int v){
if(r<x||l>y){
return ;
}
if(x<=l&&r<=y){
sum[k]=(sum[k]*v)%m;
bk_add[k]=(bk_add[k]*v)%m;
bk_mul[k]=(bk_mul[k]*v)%m;
return ;
}
pushdown_mul(k,l,r);
pushdown_add(k,l,r);
int mid=(l+r)/2;
change_mul(k*2,l,mid,x,y,v);
change_mul(k*2+1,mid+1,r,x,y,v);
sum[k]=sum[k*2]+sum[k*2+1];
return ;
}
ll query(int k,int l,int r,int x,int y){
if(r<x||l>y){
return 0;
}
if(x<=l&&r<=y){
return sum[k];
}
ll mid=(l+r)/2,ans=0;
pushdown_mul(k,l,r);
pushdown_add(k,l,r);
ans=ans+query(k*2,l,mid,x,y);
ans=ans+query(k*2+1,mid+1,r,x,y);
return ans;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=q;i++){
int c;
cin>>c;
if(c==1){
int x,y,k;
cin>>x>>y>>k;
change_mul(1,1,n,x,y,k);
}
else if(c==2){
int x,y,k;
cin>>x>>y>>k;
change_add(1,1,n,x,y,k);
}
else if(c==3){
int x,y;
cin>>x>>y;
cout<<query(1,1,n,x,y)%m<<endl;
}
}
return 0;
}