#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,q,mod,b[N];
struct node{int l,r,laz,sum,mul;}a[4*N];
inline void pushdown(int root)
{
a[root*2].sum=(a[root].mul*a[root*2].sum+((a[root*2].r-a[root*2].l+1)*a[root].laz)%mod)%mod;
a[root*2+1].sum=(a[root].mul*a[root*2+1].sum+(a[root].laz*(a[root*2+1].r-a[root*2+1].l+1))%mod)%mod;
a[root*2].mul=(a[root*2].mul*a[root].mul)%mod;
a[root*2+1].mul=(a[root*2+1].mul*a[root].mul)%mod;
a[root*2].laz=(a[root*2].laz*a[root].mul+a[root].laz)%mod;
a[root*2+1].laz=(a[root*2+1].laz*a[root].mul+a[root].laz)%mod;
a[root].mul=1,a[root].laz=0;
}
inline void build(int root,int l,int r)
{
a[root].l=l;a[root].r=r;a[root].mul=1;
if(l==r){a[root].sum=b[l]%mod;return;}
int mid=(l+r)/2;
build(root*2,l,mid);build(root*2+1,mid+1,r);
a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
}
inline int query(int root,int l,int r)
{
if(l<=a[root].l&&a[root].r<=r)return a[root].sum;
pushdown(root);
int ans=0,mid=(a[root].l+a[root].r)/2;
if(l<=mid)ans=(ans+query(root*2,l,r))%mod;
if(r>mid)ans=(ans+query(root*2+1,l,r))%mod;
return ans;
}
inline void add(int root,int l,int r,int num)
{
if(a[root].l>=l&&a[root].r<=r)
{
a[root].laz=(a[root].laz+num)%mod;
a[root].sum+=(a[root].r-a[root].l+1)*num;
return;
}
a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
pushdown(root);int mid=(a[root].l+a[root].r)/2;
if(mid>=l)add(root*2,l,r,num);
if(mid<r)add(root*2+1,l,r,num);
a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
}
inline void multi(int root,int l,int r,int num)
{
if(a[root].l>=l&&a[root].r<=r)
{
a[root].laz=(a[root].laz*num)%mod;
a[root].mul=(a[root].mul*num)%mod;
a[root].sum=(a[root].sum*num)%mod;
return;
}
pushdown(root);
a[root].sum=(a[root*2].sum*a[root*2+1].sum)%mod;
int mid=(a[root].l+a[root].r)/2;
if(mid>=l)multi(root*2,l,r,num);
if(mid<r)multi(root*2+1,l,r,num);
a[root].sum=(a[root*2].sum*a[root*2+1].sum)%mod;
}
signed main()
{
scanf("%lld%lld%lld",&n,&q,&mod);
for(int i=1;i<=n;++i)scanf("%lld",&b[i]);
build(1,1,n);
while(q--)
{
int opt,l,r,k;scanf("%lld",&opt);
if(opt==2)
{
scanf("%lld%lld%lld",&l,&r,&k);
add(1,l,r,k);
}
else if(opt==1)
{
scanf("%lld%lld%lld",&l,&r,&k);
multi(1,l,r,k);
}
else scanf("%lld%lld",&l,&r),printf("%lld\n",query(1,l,r)%mod);
}
return 0;
}