#include<bits/stdc++.h>
using namespace std;
struct node{
long long int l,r,tag1,tag2,sum;
}tree[5001000];
long long int n,q,m;
long long int arr[2000100];
void build(int l,int r,int idx){
tree[idx].l=l;tree[idx].r=r;tree[idx].tag1=0;tree[idx].tag2=1;
if(l==r){
tree[idx].sum=arr[l];
tree[idx].sum%=m;
return;
}
long long int mid=(l+r)>>1;
build(l,mid,idx*2);
build(mid+1,r,idx*2+1);
tree[idx].sum=(tree[idx*2].sum+tree[idx*2+1].sum)%m;
return;
}
void spread(long long int idx){
if(tree[idx].tag1!=0||tree[idx].tag2!=1){
tree[idx*2].tag1+=tree[idx].tag1;tree[idx*2+1].tag1+=tree[idx].tag1;tree[idx*2].tag1%=m;tree[idx*2+1].tag1%=m;
tree[idx*2].tag2*=tree[idx].tag2;tree[idx*2+1].tag2*=tree[idx].tag2;tree[idx*2].tag2%=m;tree[idx*2+1].tag2%=m;
tree[idx*2].sum=(tree[idx*2].sum*tree[idx].tag2+tree[idx].tag1*(tree[idx*2].r-tree[idx*2].l+1)%m)%m;
tree[idx*2+1].sum=(tree[idx*2+1].sum*tree[idx].tag2+tree[idx].tag1*(tree[idx*2+1].r-tree[idx*2+1].l+1)%m)%m;
tree[idx].tag1=0;tree[idx].tag2=1;
}
return;
}
void add(long long int l,long long int r,long long int idx,long long int w){
if(tree[idx].l>=l&&tree[idx].r<=r){
tree[idx].tag1+=w;tree[idx].sum+=w*(tree[idx].r-tree[idx].l+1);tree[idx].sum%=m;tree[idx].sum%=m;
return;
}
spread(idx);
long long int mid=(tree[idx].l+tree[idx].r)>>1;
if(mid>=l) add(l,r,idx*2,w);
if(mid<r) add(l,r,idx*2+1,w);
tree[idx].sum=tree[idx*2].sum+tree[idx*2+1].sum;tree[idx].sum%=m;
}
void mul(long long int l,long long int r,long long int idx,long long int w){
if(tree[idx].l>=l&&tree[idx].r<=r){
tree[idx].tag1*=w;tree[idx].tag2*=w;tree[idx].sum*=w;tree[idx].sum%=m;
return;
}
spread(idx);
long long int mid=(tree[idx].l+tree[idx].r)>>1;
if(mid>=l) mul(l,r,idx*2,w);
if(mid<r) mul(l,r,idx*2+1,w);
tree[idx].sum=tree[idx*2].sum+tree[idx*2+1].sum;tree[idx].sum%=m;
}
long long int ques(long long int l,long long int r,long long int idx){
//if(tree[idx].r<l||tree[idx].l>r) return 0;
if(tree[idx].l>=l&&tree[idx].r<=r){
return tree[idx].sum;
}
spread(idx);
long long int ans=0,mid=(tree[idx].l+tree[idx].r)>>1;
if(mid>=l) ans+=ques(l,r,idx*2);
if(mid<r) ans+=ques(l,r,idx*2+1);
ans%=m;return ans;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
build(1,n,1);
while(q--){
int x;
cin>>x;
if(x==1){
long long int l,r,w;
cin>>l>>r>>w;
mul(l,r,1,w);
}
if(x==2){
long long int l,r,w;
cin>>l>>r>>w;
add(l,r,1,w);
}
if(x==3){
long long int l,r;
cin>>l>>r;
cout<<(ques(l,r,1)%m)<<endl;
}
}
return 0;
}