#include <iostream>
#include <cstdio>
#define ll long long
#define MAXN 100005
using namespace std;
ll ans[MAXN*4],a[MAXN],tagp[MAXN*4],tagm[MAXN*4];
ll n,m,p;
inline ll ls(ll f){return f<<1;}
inline ll rs(ll f){return f<<1|1;}
inline void push_up(int f){ans[f]=(ans[ls(f)]+ans[rs(f)])%p;}
inline void build(ll l, ll r, ll f)
{
if(l==r)
{
ans[f]=a[l];
return ;
}
ll mid=(l+r)>>1;
build(l,mid,ls(f));
build(mid+1,r,rs(f));
push_up(f);
}
inline void cz(ll l, ll r, ll f, ll kp, ll km)
{
if(tagm[f]==0)tagm[f]=1;
ans[f]=(ans[f]*km)%p;
ans[f]=(ans[f]+kp*(r-l+1))%p;
tagm[f]=(tagm[f]*km)%p;
tagp[f]=(tagp[f]*km)%p;
tagp[f]=(tagp[f]+kp)%p;
}
inline void push_down(ll l, ll r, ll f)
{
ll mid=(l+r)>>1;
if(tagm[f]==0)tagm[f]=1;
cz(l, mid, ls(f), tagp[f], tagm[f]);
cz(mid+1, r, rs(f), tagp[f], tagm[f]);
tagm[f]=1;
tagp[f]=0;
}
inline void add(ll al, ll ar, ll l, ll r, ll f, ll k)
{
if(al<=l&&r<=ar)
{
tagp[f]+=k;
ans[f]+=k*(r-l+1);
return ;
}
if(tagm[f]==0)tagm[f]=1;
if(tagp[f]!=0 || tagm[f]!=1)
push_down(l,r,f);
ll mid=(l+r)>>1;
if(mid<ar)add(al,ar,mid+1,r,rs(f),k);
if(al<=mid)add(al,ar,l,mid,ls(f),k);
push_up(f);
}
inline void mult(ll ml, ll mr, ll l, ll r, ll f, ll k)
{
if(tagm[f]==0)tagm[f]=1;
if(ml<=l&&r<=mr)
{
if(tagp[f]!=0)push_down(l,r,f);
tagm[f]*=k;
ans[f]*=k;
return ;
}
if(tagp[f]!=0 || tagm[f]!=1)
push_down(l,r,f);
ll mid=(l+r)>>1;
if(mid<mr)mult(ml,mr,mid+1,r,rs(f),k);
if(ml<=mid)mult(ml,mr,l,mid,ls(f),k);
push_up(f);
}
inline ll sum(ll sl, ll sr, ll l, ll r, ll f)
{
ll total=0;
if(sl<=l&&r<=sr){return ans[f];}
if(tagp[f]!=0)push_down(l,r,f);
ll mid=(l+r)>>1;
if(mid<sr)total+=sum(sl,sr,mid+1,r,rs(f));
if(sl<=mid)total+=sum(sl,sr,l,mid,ls(f));
return total%p;
}
int main()
{
cin >> n >> m >> p;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,n,1);
ll cas,x,y,k;
for(int cc=1;cc<=m;cc++)
{
scanf("%lld",&cas);
switch(cas)
{
case 1:
{
scanf("%lld%lld%lld",&x,&y,&k);
mult(x,y,1,n,1,k);
break;
}
case 2:
{
scanf("%lld%lld%lld",&x,&y,&k);
add(x,y,1,n,1,k);
break;
}
case 3:
{
scanf("%lld%lld",&x,&y);
cout << sum(x,y,1,n,1) <<endl;
break;
}
}
}
return 0;
}