#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
struct node
{
long long sum;
int lt,rt;
}tree[maxn*4];
int add[maxn*4],mu[maxn*4];
int A[maxn];
long long ans=0;
int p;
void build(int now,int l,int r)
{
tree[now].lt=l;tree[now].rt=r;
if(l==r)
{
tree[now].sum=A[l];
return ;
}
int mid=(l+r)>>1;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void Add(int now,int val)
{
add[now]=(add[now]+val)%p;
tree[now].sum=((tree[now].sum+(tree[now].rt-tree[now].lt+1)*val))%p;
}
void Mu(int now,int val)
{
mu[now]=(mu[now]*val)%p;
tree[now].sum=(tree[now].sum*val)%p;
}
void pushdownAdd(int now)
{
Add(now*2,add[now]);
Add(now*2+1,add[now]);
add[now]=0;
}
void pushdownMu(int now)
{
Mu(now*2,mu[now]);
Mu(now*2+1,mu[now]);
mu[now]=1;
}
void modifyAdd(int now,int l,int r,int x,int y,int val)
{
if(x>=l&&y<=r)
{
pushdownAdd(now);
pushdownMu(now);
Add(now,val);
return ;
}
pushdownAdd(now);
pushdownMu(now);
int mid=(x+y)>>1;
if(mid>=l)modifyAdd(now*2,l,r,x,mid,val);
if(r>mid)modifyAdd(now*2+1,l,r,mid+1,y,val);
tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void modifyMu(int now,int l,int r,int x,int y,int val)
{
if(x>=l&&y<=r)
{
pushdownAdd(now);
pushdownMu(now);
Mu(now,val);
return ;
}
pushdownAdd(now);
pushdownMu(now);
int mid=(x+y)>>1;
if(mid>=l)modifyMu(now*2,l,r,x,mid,val);
if(r>mid)modifyMu(now*2+1,l,r,mid+1,y,val);
tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void query(int now,int l,int r,int x,int y)
{
if(x>=l&&y<=r)
{
ans=(ans+tree[now].sum)%p;
return ;
}
pushdownAdd(now);
pushdownMu(now);
int mid=(x+y)>>1;
if(mid>=l)query(now*2,l,r,x,mid);
if(r>mid)query(now*2+1,l,r,mid+1,y);
}
void Pr()
{
ans=0;
query(1,1,4,1,5);
cout<<ans<<endl;
puts(" ");
puts(" ");
}
int main()
{
int n,m;
cin>>n>>m>>p;
for(int i=1;i<=n;i++)cin>>A[i];
for(int i=1;i<=n;i++)mu[i]=1;
build(1,1,n);
while(m--)
{
int x,y,z;
cin>>x;
if(x==1)
{
cin>>x>>y>>z;
modifyMu(1,x,y,1,n,z);
}
else if(x==2)
{
cin>>x>>y>>z;
modifyAdd(1,x,y,1,n,z);
}
else
{
cin>>x>>y;
ans=0;
query(1,x,y,1,n);
cout<<ans<<endl;
}
}
return 0;
}