#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b,c,d,mod;
long long shu[100010],lazy[400020],cc[400010],ans[400020];
inline int ls(int x){
return x<<1;
}
inline int rs(int x){
return (x<<1)|1;
}
void push_up(int x){
ans[x]=(ans[ls(x)]+ans[rs(x)])%mod;
}
void build(int p,int l,int r){
cc[p]=1;
if(l==r){
ans[p]=shu[l]%mod;
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void push_down(int p,int l,int r){
int mid=(l+r)>>1;
ans[ls(p)]=((ans[ls(p)]*cc[p])+((mid-l+1)*lazy[p]))%mod;
ans[rs(p)]=((ans[rs(p)]*cc[p])+((r-mid)*lazy[p]))%mod;
cc[ls(p)]=(cc[ls(p)]*cc[p])%mod;
cc[rs(p)]=(cc[rs(p)]*cc[p])%mod;
lazy[ls(p)]=((lazy[ls(p)]*cc[p])+lazy[p])%mod;
lazy[rs(p)]=((lazy[rs(p)]*cc[p])+lazy[p])%mod;
lazy[p]=0;
cc[p]=1;
}
void jia(int p,int l,int r,int x,int y,int z){
if(x<=l&&y>=r){
ans[p]+=(r-l+1)*z;
ans[p]%=mod;
lazy[p]+=z;
lazy[p]%=mod;
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(x<=mid) {
jia(ls(p),l,mid,x,y,z);
}
if(y>mid){
jia(rs(p),mid+1,r,x,y,z);
}
push_up(p);
}
void cheng(int p,int l,int r,int x,int y,int z){
if(x<=l&&y>=r){
ans[p]*=z;
ans[p]%=mod;
lazy[p]*=z;
lazy[p]%=mod;
cc[p]*=z;
cc[p]%=mod;
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(x<=mid) {
jia(ls(p),l,mid,x,y,z);
}
if(y>mid){
jia(rs(p),mid+1,r,x,y,z);
}
push_up(p);
}
long long cha(int p,int l,int r,int x,int y){
if(x<=l&&y>=r){
return ans[p];
}
push_down(p,l,r);
int mid=(l+r)>>1;
long long anss=0;
if(x<=mid){
anss+=cha(ls(p),l,mid,x,y)%mod;
}
if(y>mid){
anss+=cha(rs(p),mid+1,r,x,y)%mod;
}
return anss%mod;
}
int main(){
cin>>n>>m>>mod;
for(int i=1;i<=n;i++) scanf("%lld",&shu[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%lld",&a);
if(a==1){
scanf("%lld%lld%lld",&b,&c,&d);
cheng(1,1,n,b,c,d);
}
if(a==2){
scanf("%lld%lld%lld",&b,&c,&d);
jia(1,1,n,b,c,d);
}
if(a==3){
scanf("%lld%lld",&b,&c);
cout<<cha(1,1,n,b,c)<<endl;
}
}
}