#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Tree{
int l,r;
int sum;
int plz,mlz;
};
Tree tree[2000005];
int n,m,mod,a[500005];
void build(int k,int left,int right){
tree[k].l=left;
tree[k].r=right;
tree[k].mlz=1;
if(left==right){
tree[k].sum=a[left]%mod;
return;
}
int mid=(left+right)>>1;
build(k*2,left,mid);
build(k*2+1,mid+1,right);
tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod;
}
void pushdown(int k){
int mid=(tree[k].l+tree[k].r)>>1;
tree[k*2].sum=(tree[k].mlz*tree[k*2].sum+((mid-tree[k].l+1)*tree[k].plz)%mod)%mod;
tree[k*2+1].sum=(tree[k].mlz*tree[k*2+1].sum+((tree[k].r-mid)*tree[k].plz)%mod)%mod;
tree[k*2].mlz=(tree[k*2].mlz*tree[k].mlz)%mod;
tree[k*2+1].mlz=(tree[k*2+1].mlz*tree[k].mlz)%mod;
tree[k*2].plz=(tree[k*2].plz*tree[k].mlz+tree[k*2].plz)%mod;
tree[k*2+1].plz=(tree[k*2+1].plz*tree[k].mlz+tree[k*2+1].plz)%mod;
}
void add(int k,int left,int right,int num){
if(left<=tree[k].l&&tree[k].r<=right){
tree[k].sum=(tree[k].sum+num*(tree[k].r-tree[k].l+1))%mod;
tree[k].plz=(tree[k].plz+num)%mod;
return;
}
pushdown(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(left<=mid)add(k*2,left,right,num);
if(mid<right)add(k*2+1,left,right,num);
tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod;
}
void mul(int k,int left,int right,int num){
if(left<=tree[k].l&&tree[k].r<=right){
tree[k].sum=(tree[k].sum*num)%mod;
tree[k].mlz=(tree[k].mlz*num)%mod;
tree[k].plz=(tree[k].plz*num)%mod;
return;
}
pushdown(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(left<=mid)mul(k*2,left,right,num);
if(mid<right)mul(k*2+1,left,right,num);
tree[k].sum=(tree[k*2].sum+tree[k*2+1].sum)%mod;
}
int query(int k,int left,int right){
if(left<=tree[k].l&&tree[k].r<=right)return tree[k].sum;
pushdown(k);
int ans=0;
if(tree[k*2].r>=left)ans=(ans+query(k*2,left,right))%mod;
if(tree[k*2+1].l<=right)ans=(ans+query(k*2+1,left,right))%mod;
return ans;
}
signed main(){
cin>>n>>m>>mod;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
mul(1,x,y,k);
}
if(op==2){
int x,y,k;
cin>>x>>y>>k;
add(1,x,y,k);
}
else{
int x,y;
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}