#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+10;
typedef long long LL;
LL a[N];
LL n,m,P;
struct Tree
{
LL l,r,lazya,lazym,sum;
Tree()
{
lazya=0;
lazym=1;
}
}tr[N*4];
void pushup(LL u) {tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%P;}
void pushdown(LL u)
{
tr[u<<1].lazya=(tr[u<<1].lazya*tr[u].lazym+tr[u].lazya)%P;
tr[u<<1|1].lazya=(tr[u<<1|1].lazya*tr[u].lazym+tr[u].lazya)%P;
tr[u<<1|1].lazym*=tr[u].lazym%P;
tr[u<<1].lazym*=tr[u].lazym%P;
tr[u<<1].sum=(tr[u<<1].sum*tr[u].lazym+(tr[u<<1].r-tr[u<<1].l+1)*tr[u].lazya)%P;
tr[u<<1|1].sum=(tr[u<<1|1].sum*tr[u].lazym+(tr[u<<1|1].r-tr[u<<1|1].l+1)*tr[u].lazya)%P;
tr[u].lazya=0,tr[u].lazym=1;
}
void build(LL u,LL l,LL r)
{
tr[u].lazya=0;
tr[u].lazym=1;
tr[u].l=l;
tr[u].r=r;
if(l==r) {tr[u].sum=a[l]%P;return;}
LL mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
LL query(LL u,LL l,LL r)
{
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
pushdown(u);
LL v=0;
LL mid=tr[u].l+tr[u].r>>1;
if(l<=mid) v=(v+query(u<<1,l,r))%P;
if(r>mid) v=(v+query(u<<1|1,l,r))%P;
return v;
}
void modifya(LL u,LL l,LL r,LL v)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].lazya=(tr[u].lazya+v)%P;
tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*v)%P;
}
else
{
pushdown(u);
LL mid=tr[u].l+tr[u].r>>1;
if(l<=mid) modifya(u<<1,l,r,v);
if(r>mid) modifya(u<<1|1,l,r,v);
pushup(u);
}
}
void modifym(LL u,LL l,LL r,LL v)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].lazym=(tr[u].lazym*v)%P;
tr[u].lazya=(tr[u].lazya*v)%P;
tr[u].sum=(tr[u].sum*v)%P;
}
else
{
pushdown(u);
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
LL mid=tr[u].l+tr[u].r>>1;
if(l<=mid) modifym(u<<1,l,r,v);
if(r>mid) modifym(u<<1|1,l,r,v);
pushup(u);
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&P);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
LL k,x,y,z;
scanf("%lld",&k);
if(k==1)
{
scanf("%lld%lld%lld",&x,&y,&z);
modifym(1,x,y,z);
}
if(k==2)
{
scanf("%lld%lld%lld",&x,&y,&z);
modifya(1,x,y,z);
}
if(k==3)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,x,y));
}
}
return 0;
}