#include<bits/stdc++.h>
using namespace std;
long long n,q,m,siz,tot;
long long bel[100005],sum[400],L[400],R[400],add[400],add1[400],a[100005];
void init()
{
siz=sqrt(n);
tot=n/siz;
if (n%siz) tot++;
for (int i=1;i<=400;i++) add1[i]=1;
for (int i=1;i<=tot;i++) L[i]=siz*(i-1)+1,R[i]=min(siz*i,n);
for (int i=1;i<=n;i++) bel[i]=(i-1)/siz+1;
for (int i=1;i<=n;i++) sum[bel[i]]+=a[i];
}
void update1(long long l,long long r,long long k)
{
long long x=bel[l],y=bel[r];
if (x==y)
{
for (int i=l;i<=r;i++) a[i]+=k,sum[x]+=k;
}
else
{
for (int i=l;i<=R[x];i++) a[i]+=k,sum[x]+=k;
for (int i=L[y];i<=r;i++) a[i]+=k,sum[y]+=k;
for (int i=x+1;i<=y-1;i++) add[i]+=k,sum[i]+=k*siz;
}
return;
}
void update11(long long l,long long r,long long k)
{
long long x=bel[l],y=bel[r];
long long ji=k-1;
if (x==y)
{
for (int i=l;i<=r;i++) a[i]*=k,sum[x]+=a[i]*ji;
}
else
{
for (int i=l;i<=R[x];i++) a[i]*=k,sum[x]+=a[i]*ji;
for (int i=L[y];i<=r;i++) a[i]*=k,sum[y]+=a[i]*ji;
for (int i=x+1;i<=y;i++) add[i]*=k,sum[i]*=k,add1[i]=k*add1[i];
}
return;
}
long long update0(long long l,long long r)
{
long long ans=0;
long long x=bel[l],y=bel[r];
if (x==y)
{
for (int i=l;i<=r;i++) ans+=a[i]*add1[x]+add[x];
}
else
{
for (int i=L[y];i<=r;i++) ans+=a[i]*add1[y]+add[y];
for (int i=l;i<=R[x];i++) ans+=a[i]*add1[x]+add[x];
for (int i=x+1;i<=y-1;i++) ans+=sum[i];
}
return ans;
}
int main()
{
cin>>n>>q>>m;
for (int i=1;i<=n;i++) cin>>a[i];
init();
for (int i=1;i<=q;i++)
{
long long o,x,y,k;
cin>>o>>x>>y;
if (o==1)
{
cin>>k;
update1(x,y,k);
}
else if(o==3)
{
cout<<update0(x,y)%m<<endl;
}
else
{
cin>>k;
update11(x,y,k);
}
}
return 0;
}