#include<bits/stdc++.h>
using namespace std;
struct Node{
long long l,r,tag_x,tag_p,val;
};
Node tree[1000010];
long long a[1000010];
long long n,q,Mod;
long long build(long long l,long long r,long long index_){
tree[index_].l=l;
tree[index_].r=r;
tree[index_].tag_x=1;
if(l==r){
tree[index_].val=a[l];
tree[index_].val%=Mod;
return tree[index_].val;
}
tree[index_].val=build(l,l+(r-l)/2,index_*2)+build(l+(r-l)/2+1,r,index_*2+1);
tree[index_].val%=Mod;
return tree[index_].val;
}
void spread(long long index_){
long long tg_x=tree[index_].tag_x;
long long tg_p=tree[index_].tag_p;
tree[index_].tag_x=1;
tree[index_].tag_p=0;
tree[index_*2].val*=tg_x;
tree[index_*2].val+=tg_p;
tree[index_*2].tag_x*=tg_x;
tree[index_*2].tag_p*=tg_x;
tree[index_*2].tag_p+=tg_p;
tree[index_*2+1].val%=Mod;
tree[index_*2+1].val*=tg_x;
tree[index_*2+1].val+=tg_p;
tree[index_*2+1].tag_x*=tg_x;
tree[index_*2+1].tag_p*=tg_x;
tree[index_*2+1].tag_p+=tg_p;
tree[index_*2+1].val%=Mod;
return;
}
void push_up(long long index_){
tree[index_].val=tree[index_*2].val+tree[index_*2+1].val;
tree[index_].val%=Mod;
}
void plus_x(long long l,long long r,long long index_,long long num){
if(l>r)return;
if(tree[index_].l==l&&tree[index_].r==r){
tree[index_].tag_p*=num;
tree[index_].tag_x*=num;
tree[index_].val*=num;
tree[index_].val%=Mod;
return;
}
spread(index_);
plus_x(l,min(r,tree[index_*2].r),index_*2,num);
plus_x(max(l,tree[index_*2+1].l),r,index_*2+1,num);
push_up(index_);
return;
}
void plus_p(long long l,long long r,long long index_,long long num){
if(l>r)return;
if(tree[index_].l==l&&tree[index_].r==r){
tree[index_].val+=(r-l+1)*num;
tree[index_].tag_p+=num;
tree[index_].val%=Mod;
return;
}
plus_p(l,min(r,tree[index_*2].r),index_*2,num);
plus_p(max(l,tree[index_*2+1].l),r,index_*2+1,num);
push_up(index_);
return;
}
long long Fd(long long l,long long r,long long index_){
if(l>r)return 0;
if(tree[index_].l==l&&tree[index_].r==r){
return tree[index_].val;
}
spread(index_);
return Fd(l,min(r,tree[index_*2].r),index_*2)+Fd(max(l,tree[index_*2+1].l),r,index_*2+1);
}
int main(){
cin>>n>>q>>Mod;
for(long long i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
while(q--){
long long x;
cin>>x;
if(x==1){
long long l,r,k;
cin>>l>>r>>k;
plus_x(l,r,1,k);
}else if (x==2){
long long l,r,k;
cin>>l>>r>>k;
plus_p(l,r,1,k);
}else{
long long l,r;
cin>>l>>r;
cout<<Fd(l,r,1)%Mod<<endl;
}
}
}