#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
struct tree
{
int l,r;
long long v,c2=1,c;
}t[4*MAX];
int v[MAX],n,m,p;
void upd(int x,long long c,long long c2)
{
t[x].v=((t[x].v*c2)%p+((t[x].r-t[x].l+1)*c)%p)%p;
t[x].c*=c2;
t[x].c%=p;
t[x].c+=c;
t[x].c%=p;
t[x].c2*=c2;
t[x].c2%=p;
}
void build(int x,int l,int r)
{
int mid=(l+r)>>1;
if(l==r)
{
t[x].l=t[x].r=l;
t[x].v=v[l];
return;
}
build(x<<1,l,mid);
build((x<<1)+1,mid+1,r);
t[x].l=l;
t[x].r=r;
t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
void add(int x,int l,int r,long long c)
{
if(t[x].l>=l && t[x].r<=r)
{
t[x].v+=c*(t[x].r-t[x].l+1);
t[x].c+=c;
return;
}
if(t[x].l!=t[x].r)
if(t[x].c!=0 || t[x].c2!=1)
{
upd(x<<1,t[x].c,t[x].c2);
upd((x<<1)+1,t[x].c,t[x].c2);
t[x].c=0;
t[x].c2=1;
}
int mid=(t[x].l+t[x].r)>>1;
if(mid==0) return;
if(mid>=l) add(x<<1,l,r,c);
if(mid<r) add((x<<1)+1,l,r,c);
t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
void cheng(int x,int l,int r,long long c)
{
if(t[x].l>=l && t[x].r<=r)
{
t[x].c*=c;
t[x].c%=p;
t[x].v*=c;
t[x].v%=p;
t[x].c2*=c;
t[x].c2%=p;
return;
}
if(t[x].l!=t[x].r)
if(t[x].c!=0 || t[x].c2!=1)
{
upd(x<<1,t[x].c,t[x].c2);
upd((x<<1)+1,t[x].c,t[x].c2);
t[x].c=0;
t[x].c2=1;
}
int mid=(t[x].l+t[x].r)>>1;
if(mid==0) return;
if(mid>=l) cheng(x<<1,l,r,c);
if(mid<r) cheng((x<<1)+1,l,r,c);
t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
long long getsum(int x,int l,int r)
{
if(t[x].l==0) return 0;
if(t[x].l!=t[x].r)
if(t[x].c!=0 || t[x].c2!=1)
{
upd(x<<1,t[x].c,t[x].c2);
upd((x<<1)+1,t[x].c,t[x].c2);
t[x].c=0;
t[x].c2=1;
}
long long ans=0;
if(t[x].l>=l && t[x].r<=r)
{
ans=t[x].v;
return ans%p;
}
int mid=(t[x].l+t[x].r)>>1;
if(mid>=l) ans+=getsum(x<<1,l,r);
ans%=p;
if(mid<r) ans+=getsum((x<<1)+1,l,r);
ans%=p;
return ans;
}
signed main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
long long kk;
scanf("%lld",&kk);
v[i]=kk%p;
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int tp;
scanf("%d",&tp);
if(tp==1)
{
int l,r;
long long k;
scanf("%d%d%lld",&l,&r,&k);
cheng(1,l,r,k%p);
}
if(tp==2)
{
int l,r;
long long k;
scanf("%d%d%lld",&l,&r,&k);
add(1,l,r,k);
}
if(tp==3)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",getsum(1,l,r));
}
}
return 0;
}