#include<stdio.h>
#include<cstring>
using namespace std;
inline long long read(){
long long k=0,j=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')j=-1;c=getchar();}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k*j;
}
long long p,a[100005],sum[400005],mul[400005],add[400005];
void Mul(long long k,long long l,long long r,long long v){
add[k]=(add[k]*v)%p;mul[k]=(mul[k]*v)%p;sum[k]=(sum[k]*v)%p;
}
void Add(long long k,long long l,long long r,long long v){
add[k]=(add[k]+v)%p;sum[k]=(sum[k]+v*(r-l+1))%p;
}
long long pushdown(long long k,long long l,long long r,long long mid){
if(mul[k]!=1){
Mul(k*2,l,mid,mul[k]);
Mul(k*2+1,mid+1,r,mul[k]);
mul[k]=1;
}
if(add[k]!=0){
Add(k*2,l,mid,add[k]);
Add(k*2+1,mid+1,r,add[k]);
add[k]=0;
}
}
void modify_add(long long k,long long l,long long r,long long x,long long y,long long v){
if(x<=l&&r<=y){Add(k,l,r,v);return;}
long long mid=(l+r)/2;
pushdown(k,l,r,mid);
if(mid>=x)modify_add(k*2,l,mid,x,y,v);
if(mid<y)modify_add(k*2+1,mid+1,r,x,y,v);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
void modify_mul(long long k,long long l,long long r,long long x,long long y,long long v){
if(x<=l&&r<=y){Mul(k,l,r,v);return;}
long long mid=(l+r)/2;
pushdown(k,l,r,mid);
if(mid>=x)modify_mul(k*2,l,mid,x,y,v);
if(mid<y)modify_mul(k*2+1,mid+1,r,x,y,v);
sum[k]=(sum[k*2]+sum[k*2+1])%p;
}
long long query(long long k,long long l,long long r,long long x,long long y){
if(x<=l&&r<=y)return sum[k];
long long res=0,mid=(l+r)/2;
pushdown(k,l,r,mid);
if(mid>=x)res+=query(k*2,l,mid,x,y);
if(mid<y)res+=query(k*2+1,mid+1,r,x,y);
return res;
}
void build(long long k,long long l,long long r){
if(l==r){sum[k]=a[l];return ;}
long long 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])%p;
}
int main(){
long long n=read(),m=read();p=read();
for(long long i=1;i<=n;i++)a[i]=read();
for(long long i=1;i<=n*4;i++)mul[i]=1;
build(1,1,n);
while(m--){
long long x=read();
if(x==1){
long long s=read(),t=read(),v=read();
modify_mul(1,1,n,s,t,v);
}
if(x==2){
long long s=read(),t=read(),v=read();
modify_add(1,1,n,s,t,v);
}
if(x==3){
long long s=read(),t=read();
printf("%lld\n",query(1,1,n,s,t)%p);
}
}
return 0;
}