#include<iostream>
using namespace std;
long long n,q,m;
long long num[100005];
struct node{
long long l;
long long r;
long long pre;
long long add;
long long mul;
}t[400005];
long long build(long long x,long long ll,long long rr){
t[x].l=ll;t[x].r=rr;
t[x].mul=1;
if(ll==rr){
t[x].pre=num[ll]%m;
return t[x].pre;
}
long long mid=(t[x].l+t[x].r)/2;
t[x].pre+=build(x*2,ll,mid)%m;
t[x].pre+=build(x*2+1,mid+1,rr)%m;
return t[x].pre;
}
void aa(long long x){
t[x*2].add+=t[x].add;
t[x*2+1].add+=t[x].add;
t[x*2].pre+=(t[x*2].r-t[x*2].l+1)*t[x].add;
t[x*2].pre%=m;
t[x*2+1].pre+=(t[x*2+1].r-t[x*2+1].l+1)*t[x].add;
t[x*2+1].pre%=m;
t[x].pre=t[x*2].pre+t[x*2+1].pre;
t[x].pre%=m;
t[x].add=0;
}
void cc(long long x){
t[x*2].mul*=t[x].mul;
t[x*2+1].mul*=t[x].mul;
t[x*2].pre*=t[x*2].mul;
t[x*2].pre%=m;
t[x*2+1].pre*=t[x*2+1].mul;
t[x*2+1].pre%=m;
t[x].pre=t[x*2].pre+t[x*2+1].pre;
t[x].pre%=m;
t[x].mul=1;
}
void cheng(long long x,long long ll,long long rr,long long kk){
if(t[x].l>=ll&&t[x].r<=rr){
t[x].mul*=kk;
t[x].pre*=kk;
t[x].pre%=m;
return;
}
long long mid=(t[x].l+t[x].r)/2;
cc(x);
if(ll<=mid){
cheng(x*2,ll,rr,kk);
}
if(rr>mid){
cheng(x*2+1,ll,rr,kk);
}
t[x].pre=t[x*2].pre+t[x*2+1].pre;
t[x].pre%=m;
}
void jia(long long x,long long ll,long long rr,long long kk){
if(t[x].l>=ll&&t[x].r<=rr){
t[x].add+=kk;
t[x].pre+=kk*(t[x].r-t[x].l+1);
t[x].pre%=m;
return;
}
long long mid=(t[x].l+t[x].r)/2;
aa(x);
if(ll<=mid){
jia(x*2,ll,rr,kk);
}
if(rr>mid){
jia(x*2+1,ll,rr,kk);
}
t[x].pre=t[x*2].pre+t[x*2+1].pre;
t[x].pre%=m;
}
long long ques(long long x,long long ll,long long rr){
if(t[x].l>=ll&&t[x].r<=rr){
return t[x].pre;
}
if(t[x].add!=0){
aa(x);
}
if(t[x].mul!=1){
cc(x);
}
long long mid=(t[x].l+t[x].r)/2;
long long maxx=0;
if(ll<=mid){
maxx+=ques(x*2,ll,rr);
maxx%=m;
}
if(rr>mid){
maxx+=ques(x*2+1,ll,rr);
maxx%=m;
}
return maxx;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>num[i];
num[i]%=m;
}
build(1,1,n);
for(int i=1;i<=q;i++){
int ls;
cin>>ls;
if(ls==1){
long long x,y,k;
cin>>x>>y>>k;
cheng(1,x,y,k);
}
else if(ls==2){
long long x,y,k;
cin>>x>>y>>k;
jia(1,x,y,k);
}
else if(ls==3){
long long x,y;
cin>>x>>y;
cout<<ques(1,x,y)%m<<endl;
}
}
return 0;
}