#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long int n,m,a[100005],ls[400025],rs[400025],sum[400025],rt=1,addv[400025],chengv[400025],p;
void build(int x,int l,int r)
{
chengv[x]=1;
addv[x]=0;
if(l==r)
{
sum[x]=a[l];
return ;
}
int mid=(l+r)>>1;
ls[x]=++rt;
rs[x]=++rt;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
sum[x]=(sum[ls[x]]+sum[rs[x]])%p;
}
void add(int x,int l,int r,int v)
{
addv[x]+=v;
addv[x]%=p;
sum[x]+=(r-l+1)*v;
sum[x]%=p;
}
void cheng(int x,int l,int r,int v)
{
chengv[x]*=v;
chengv[x]%=p;
addv[x]*=v;
addv[x]%=p;
sum[x]*=v;
sum[x]%=p;
}
void pushdown(int x,int l,int r)
{
int mid=(l+r)>>1;
cheng(ls[x],l,mid,chengv[x]);
cheng(rs[x],mid+1,r,chengv[x]);
chengv[x]=1;
add(ls[x],l,mid,addv[x]);
add(rs[x],mid+1,r,addv[x]);
addv[x]=0;
}
void setadd(int x,int l,int r,int nl,int nr,int v)
{
int mid=(l+r)>>1;
if(nl<=l&&nr>=r)
{
add(x,l,r,v);
return ;
}
pushdown(x,l,r);
if(nl<=mid)setadd(ls[x],l,mid,nl,nr,v);
if(nr>mid)setadd(rs[x],mid+1,r,nl,nr,v);
sum[x]=sum[ls[x]]+sum[rs[x]];
sum[x]%=p;
}
void setcheng(int x,int l,int r,int nl,int nr,int v)
{
int mid=(l+r)>>1;
if(nl<=l&&nr>=r)
{
cheng(x,l,r,v);
return ;
}
pushdown(x,l,r);
if(nl<=mid)setcheng(ls[x],l,mid,nl,nr,v);
if(nr>mid)setcheng(rs[x],mid+1,r,nl,nr,v);
sum[x]=sum[ls[x]]+sum[rs[x]];
sum[x]%=p;
}
long long int ans(int x,int l,int r,int nl,int nr)
{
int mid=(l+r)>>1;
if(nl<=l&&nr>=r)
return sum[x];
long long int s=0;
pushdown(x,l,r);
if(nl<=mid)s+=ans(ls[x],l,mid,nl,nr);
if(nr>mid)s+=ans(rs[x],mid+1,r,nl,nr);
s%=p;
return s;
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
long long int x,y,z;
cin>>x;
if(x==1)
{
cin>>x>>y>>z;
setcheng(1,1,n,x,y,z);
}
if(x==2)
{
cin>>x>>y>>z;
setadd(1,1,n,x,y,z);
}
if(x==3)
{
cin>>x>>y;
cout<<ans(1,1,n,x,y)<<endl;
}
}
return 0;
}```