#include<bits/stdc++.h>
using namespace std;
int n,q,mod,k,op,x,y;
long long a[100005],la[500005],la2[500005],b[500005];
void build(int l,int r,int u){
la2[u]=1;
if(l==r){
b[u]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,u*2);
build(mid+1,r,u*2+1);
b[u]=b[u*2]+b[u*2+1];
b[u]%=mod;
}
void pushdown(int l,int r,int u){
int mid=(l+r)/2;
b[u*2]=(b[u*2]*la2[u]+(mid-l+1)*la[u])%mod;
b[u*2+1]=(b[u*2+1]*la2[u]+(mid-l+1)*la[u])%mod;
la2[u*2]*=la2[u];
la2[u*2]%=mod;
la2[u*2+1]*=la2[u];
la2[u*2+1]%=mod;
la[u*2]=(la[u*2]*la2[u]+la[u])%mod;
la[u*2+1]=(la[u*2+1]*la2[u]+la[u])%mod;
la[u]=0;
la2[u]=1;
}
void update(int l,int r,int u,int ql,int qr){
if(ql>r||qr<l){
return ;
}
if(ql<=l&&qr>=r){
b[u]+=k*(r-l+1);
b[u]%=mod;
la[u]+=k;
la[u]%=mod;
return ;
}
pushdown(l,r,u);
int mid=(l+r)/2;
update(l,mid,u*2,ql,qr);
update(mid+1,r,u*2+1,ql,qr);
b[u]=b[u*2]+b[u*2+1];
b[u]%=mod;
}
void update2(int l,int r,int u,int ql,int qr){
if(ql>r||qr<l){
return ;
}
if(ql<=l&&qr>=r){
b[u]*=k;
b[u]%=mod;
la2[u]*=k;
la2[u]%=mod;
la[u]*=k;
la[u]%=mod;
return ;
}
pushdown(l,r,u);
int mid=(l+r)/2;
update(l,mid,u*2,ql,qr);
update(mid+1,r,u*2+1,ql,qr);
b[u]=b[u*2]+b[u*2+1];
b[u]%=mod;
}
long long query(int l,int r,int u,int ql,int qr){
if(ql>r||qr<l){
return 0;
}
if(ql<=l&&qr>=r){
return b[u];
}
pushdown(l,r,u);
int mid=(l+r)/2;
return (query(l,mid,u*2,ql,qr)+query(mid+1,r,u*2+1,ql,qr))%mod;
}
int main(){
cin>>n>>q>>mod;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]%=mod;
}
build(1,n,1);
while(q--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
k%=mod;
update2(1,n,1,x,y);
}else if(op==2){
cin>>k;
k%=mod;
update(1,n,1,x,y);
}else{
cout<<query(1,n,1,x,y)%mod<<"\n";
}
}
}