#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n,q,m,a[N];
struct p
{
int l,r,lz_a,lz_t=1,sum;
}t[N*4];
void push_down_a(int u,int ad)
{
t[2*u].lz_a+=ad;
t[2*u+1].lz_a+=ad;
}
void push_down_t(int u,int ti)
{
t[2*u].lz_t=t[2*u].lz_t*ti%m;
t[2*u+1].lz_t=t[2*u+1].lz_t*ti%m;
}
void build(int u,int l,int r)
{
t[u].l=l,t[u].r=r;
if (l==r)
{
t[u].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;
return ;
}
void add(int u,int l,int r,int ad)
{
if(t[u].r<l||t[u].l>r) return;
if (t[u].l>=l&&t[u].r<=r)
{
if (t[u].lz_t)
{
t[u].sum=t[u].sum*t[u].lz_t%m;
push_down_t(u,t[u].lz_t);
t[u].lz_t=0;
}
t[u].lz_a+=ad;
return ;
}
add(2*u,l,r,ad);
add(2*u+1,l,r,ad);
t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;
return ;
}
void tim(int u,int l,int r,int ti)
{
if(t[u].r<l||t[u].l>r) return;
if (t[u].l>=l&&t[u].r<=r)
{
if (t[u].lz_a)
{
t[u].sum=(t[u].sum+t[u].lz_a*(t[u].r-t[u].l+1))%m;
push_down_a(u,t[u].lz_a);
t[u].lz_a=0;
}
t[u].lz_t*=ti;
return ;
}
tim(2*u,l,r,ti);
tim(2*u+1,l,r,ti);
t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;
}
int query(int u,int l,int r)
{
if(t[u].r<l||t[u].l>r) return 0;
if (t[u].l>=l&&t[u].r<=r)
{
if (t[u].lz_a)
{
t[u].sum=(t[u].sum+t[u].lz_a*(t[u].r-t[u].l+1))%m;
push_down_a(u,t[u].lz_a);
t[u].lz_a=0;
}
if (t[u].lz_t)
{
t[u].sum=t[u].sum*t[u].lz_t%m;
push_down_t(u,t[u].lz_t);
t[u].lz_t=0;
}
return t[u].sum;
}
return (query(u*2,l,r)%m+query(u*2+1,l,r)%m)%m;
}
int main()
{
cin>>n>>q>>m;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
build (1,1,n);
for (int i=1;i<=q;i++)
{
int opt;
cin>>opt;
if (opt==1)
{
int x,y,k;
cin>>x>>y>>k;
tim(1,x,y,k);
}
if (opt==2)
{
int x,y,k;
cin>>x>>y>>k;
add(1,x,y,k);
}
if (opt==3)
{
int x,y;
cin>>x>>y;
cout<<query(1,x,y)<<"\n";
}
}
return 0;
}