#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll a[maxn];
ll p;
struct nod{
int l,r;
ll sum;
ll tagc;
ll tagj;
}t[maxn*4];
void push_down(int num)
{
t[num*2].tagj=(t[num].tagj+t[num<<1].tagj*t[num].tagc%p)%p;
t[num*2+1].tagj=(t[num].tagj+t[(num<<1)+1].tagj*t[num].tagc%p)%p;
t[num*2].tagc=t[num*2].tagc*t[num].tagc%p;
t[num*2+1].tagc=t[num*2+1].tagc*t[num].tagc%p;
t[num<<1].sum=t[num<<1].sum+(t[num<<1].r-t[num<<1].l+1)%p*t[num].tagc%p+(t[num<<1].r-t[num<<1].l+1)%p*t[num].tagj%p;
t[num<<1|1].sum=t[num<<1|1].sum+(t[num<<1|1].r-t[num<<1|1].l+1)%p*t[num].tagc%p+(t[num<<1|1].r-t[num<<1|1].l+1)%p*t[num].tagj%p;
t[num].tagc=1;
t[num].tagj=0;
}
void build(int num,int l,int r)
{
t[num].l=l;
t[num].r=r;
if(l==r)
{
t[num].sum=a[l]%p;
t[num].tagc=1;
t[num].tagj=0;
return;
}
int mid=(l+r)>>1;
cout<<num<<" "<<l<<" "<<" "<<r<<" "<<mid<<endl;
build(num*2,l,mid);
cout<<"ok";
build(num*2+1,mid+1,r);
t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
t[num].sum%=p;
return;
}
ll query(int num,int l,int r)
{
if(t[num].l>=l && t[num].r<=r)
{
return t[num].sum%p;
}
push_down(num);
int mid=l+r>>1;
ll ans=0;
if( l<=mid )
ans+=query(num*2,l,r),ans%=p;
if(r>mid)
ans+=query(num<<1|1,l,r),ans%=p;
return ans;
}
void modiefyc(int num,int l,int r,ll v)
{
cout<<"bug";
if(t[num].l>=l && t[num].r<=r)
{
t[num].tagc=t[num].tagc*v%p;
t[num].tagj=(t[num].tagj*v)%p;
t[num].sum=t[num].sum*v;
t[num].sum%=p;
return;
}
push_down(num);
int mid=l+r>>1;
if(l<=mid) modiefyc(num*2,l,r,v);
if(r>mid) modiefyc(num*2+1,l,r,v);
t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
t[num].sum%=p;
}
void modiefyj(int num,int l,int r,ll v)
{
cout<<"modiefyjbug";
if(t[num].l>=l && t[num].r<=r)
{
t[num].tagj=(t[num].tagj+v)%p;
t[num].sum=(t[num].r-t[num].l+1)*v;
return;
}
push_down(num);
int mid=l+r>>1;
if(l<=mid) modiefyj(num*2,l,r,v);
if(r>mid) modiefyj(num*2+1,l,r,v);
t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
t[num].sum%=p;
}
int main()
{
int n,m,p;
cin>>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++)
{
\
int opt;
scanf("%d",&opt);
if(opt==1)
{
int x,y;
ll k;
scanf("%d%d%lld",&x,&y,&k);
modiefyc(1,x,y,k);
}
if(opt==2)
{
int x,y;
ll k;
scanf("%d%d%lld",&x,&y,&k);
modiefyj(1,x,y,k);
}
if(opt==3)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,x,y)%p);
}
}
return 0;
}