#include<bits/stdc++.h>
using namespace std;
long long x,y,k,pd,n,m,b[100010],mod;
struct tree{
long long lc,rc,v,la,la2,le;
}a[400010];
void build(long long ro,long long l,long long r){
a[ro].lc=l;
a[ro].rc=r;
a[ro].le=r-l+1;
a[ro].la=0;
a[ro].la2=1;
if(l==r){
a[ro].v=b[l]%mod;
}
else{
long long mid=(l+r)/2;
build(ro*2,l,mid);
build(ro*2+1,mid+1,r);
a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
}
return ;
}
void pushdown(long long root){
a[root*2].v=((a[root].la*a[root*2].le)%mod+a[root].la2*a[root*2].v)%mod;
a[root*2+1].v=((a[root].la*a[root*2+1].le)%mod+a[root].la2*a[root*2+1].v)%mod;
a[root*2].la2=(a[root].la2*a[root*2].la2)%mod;
a[root*2+1].la2=(a[root].la2*a[root*2+1].la2)%mod;
a[root*2].la=(a[root].la2*a[root*2].la+a[root].la)%mod;
a[root*2+1].la=(a[root].la2*a[root*2+1].la+a[root].la)%mod;
a[root].la2=1;
a[root].la=0;
return ;
}
void update(long long ro,long long lch,long long rch,long long add){
if(lch<=a[ro].lc&&a[ro].rc<=rch){
a[ro].la=(a[ro].la+add)%mod;
a[ro].v=(a[ro].v+(add*a[ro].le)%mod)%mod;
return ;
}
if(a[ro].lc>rch||a[ro].rc<lch){
return ;
}
if(a[ro].la!=0||a[ro].la2!=1){
pushdown(ro);
}
update(ro*2,lch,rch,add);
update(ro*2+1,lch,rch,add);
a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
return ;
}
void chen(long long ro,long long lch,long long rch,long long add){
if(lch<=a[ro].lc&&a[ro].rc<=rch){
a[ro].la=(a[ro].la*add)%mod;
a[ro].la2=(a[ro].la2*add)%mod;
a[ro].v=(a[ro].v*add)%mod;
return ;
}
if(a[ro].lc>rch||a[ro].rc<lch){
return ;
}
if(a[ro].la!=0||a[ro].la2!=1){
pushdown(ro);
}
update(ro*2,lch,rch,add);
update(ro*2+1,lch,rch,add);
a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
return ;
}
long long he(long long root,long long l,long long r){
if(l<=a[root].lc&&a[root].rc<=r){
return (a[root].v%mod);
}
if(a[root].lc>r||a[root].rc<l){
return 0;
}
if(a[root].la!=0||a[root].la2!=1){
pushdown(root);
}
return ((he(root*2,l,r)%mod+he(root*2+1,l,r)%mod)%mod);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>mod;
for(long long i=1;i<=n;i++){
cin>>b[i];
}
build(1,1,n);
for(long long i=1;i<=m;i++){
cin>>pd>>x>>y;
if(pd==1){
cin>>k;
k=k%mod;
chen(1,x,y,k);
}
else if(pd==2){
cin>>k;
update(1,x,y,k);
}
else{
cout<<(he(1,x,y)%mod)<<"\n";
}
}
return 0;
}