#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define double long double
using namespace std;
typedef long long ll;
using PII = pair<int,int>;
using ull=unsigned long long;
const int N=1e6+10;
const ull base=13331;
const ull modp=212370440130137957ll;
int mod;
int a[N];
struct node{
int l,r;
int sum,add,mul;
}tr[N*4];
void pushup(int u){
tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%mod;
}
void pushdown(int u){
auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
left.sum=(left.sum*root.mul+(left.r-left.l+1)*root.add)%mod;
right.sum=(right.sum*root.mul+(right.r-right.l+1)*root.add)%mod;
left.add=(left.add*root.mul+root.add)%mod;
right.add=(right.add*root.mul+root.add)%mod;
left.mul=(left.mul*root.mul)%mod;
right.mul=(right.mul*root.mul)%mod;
root.mul=1;
root.add=0;
}
void build(int u,int l,int r){
if(l==r) tr[u]={l,r,a[l],0,1};
else{
tr[u].l=l,tr[u].r=r;
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void mull(int u,int l,int r,int k){
if(tr[u].l>=l && tr[u].r<=r){
tr[u].mul=(tr[u].mul*k)%mod;
tr[u].add=(tr[u].add*k)%mod;
tr[u].sum=(tr[u].sum*k)%mod;
}
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) mull(u<<1,l,r,k);
if(r>mid) mull(u<<1|1,l,r,k);
pushup(u);
}
}
void addd(int u,int l,int r,int k){
if(tr[u].l>=l && tr[u].r<=r){
tr[u].add=(tr[u].add+k)%mod;
tr[u].sum=(tr[u].sum+k*(tr[u].r-tr[u].l+1))%mod;
}
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) addd(u<<1,l,r,k);
if(r>mid) addd(u<<1|1,l,r,k);
pushup(u);
}
}
int query(int u,int l,int r){
if(tr[u].l>=l && tr[u].r<=r){
return tr[u].sum;
}
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
int sum=0;
if(l<=mid) sum=(sum+query(u<<1,l,r))%mod;
if(r>mid) sum=(sum+query(u<<1|1,l,r))%mod;
return sum;
}
}
void solve(){
int n,m;
cin>>n>>m>>mod;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,k;
cin>>l>>r>>k;
mull(1,l,r,k);
}
else if(op==2){
int l,r,k;
cin>>l>>r>>k;
addd(1,l,r,k);
}
else{
int l,r;
cin>>l>>r;
cout<<query(1,l,r)<<endl;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t=1;
while(t--){
solve();
}
}