#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
#define int long long
int mod;
int n,m;int opt;int l2,r2,z;int a[maxn];
struct E
{
int l,r;
int val;
int add;int mul=1;
}num[maxn];
void build(int l,int r,int node)
{
num[node].l=l;num[node].r=r;num[node].val=0;
if(l==r){num[node].val=a[l];return;}
int m=(l+r)>>1;
build(l,m,node*2);
build(m+1,r,node*2+1);
num[node].val=num[node*2].val+num[node*2+1].val;
}
void pushdown(int node)
{
num[node*2].val=(num[node*2].val*num[node].mul%mod+num[node].add*(num[node*2].r-num[node*2].l+1)%mod)%mod;
num[node*2].mul*=num[node].mul%mod;
num[node*2].add=(num[node*2].add*num[node].mul%mod+num[node].add)%mod;
num[node*2+1].val=(num[node*2+1].val*num[node].mul%mod+num[node].add*(num[node*2+1].r-num[node*2+1].l+1)%mod)%mod;
num[node*2+1].mul*=num[node].mul%mod;
num[node*2+1].add=(num[node*2+1].add*num[node].mul%mod+num[node].add)%mod;
num[node].mul=1,num[node].add=0;
}
void modify2(int q,int w,int x,int node)
{
int l=num[node].l,r=num[node].r;
if(q<=l&&w>=r)
{
num[node].val=num[node].val*x%mod;
num[node].mul*=x%mod;
num[node].add*=x%mod;
return;
}
int m=(l+r)>>1;
pushdown(node);
if(q<=m){modify2(q,w,x,node*2);}
if(w>m){modify2(q,w,x,node*2+1);}
num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
void modify(int q,int w,int x,int node)
{
int l=num[node].l,r=num[node].r;
if(q<=l&&w>=r)
{
num[node].val+=x*(r-l+1)%mod;
num[node].add+=x%mod;
return;
}
int m=(l+r)>>1;
pushdown(node);
if(q<=m){modify(q,w,x,node*2);}
if(w>m){modify(q,w,x,node*2+1);}
num[node].val=(num[node*2].val+num[node*2+1].val)%mod;
}
int query(int q,int w,int node)
{
int l=num[node].l;int r=num[node].r;
if(l>=q&&r<=w){return num[node].val%mod;}
int m=(l+r)>>1;
int sum=0;
pushdown(node);
if(q<=m){sum+=query(q,w,node*2)%mod;}
if(w>m){sum+=query(q,w,node*2+1)%mod;}
return sum%mod;
}
signed main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
cin>>opt;
if(opt==2)
{
cin>>l2>>r2>>z;
modify(l2,r2,z,1);
}
else if(opt==3)
{
cin>>l2>>r2;
cout<<query(l2,r2,1)%mod<<endl;
}
else if(opt==1)
{
cin>>l2>>r2>>z;
modify2(l2,r2,z,1);
}
}
return 0;
}