#include <bits/stdc++.h>
using namespace std;
const long long Maxn=100010;
long long xds[Maxn*4],a[Maxn],addlazy[Maxn*4]={0},mullazy[Maxn*4];
long long n,m,p;
void push_up (long long rt){xds[rt]=xds[rt<<1]+xds[rt<<1|1];return ;}
void push_down (long long rt,long long ls,long long rs)
{
xds[rt<<1]=(xds[rt<<1]+ls*addlazy[rt])%p*mullazy[rt]%p;
xds[rt<<1|1]=(xds[rt<<1|1]+rs*addlazy[rt])%p*mullazy[rt]%p;
addlazy[rt<<1]+=addlazy[rt];
addlazy[rt<<1|1]+=addlazy[rt];
mullazy[rt<<1]*=mullazy[rt];
mullazy[rt<<1|1]*=mullazy[rt];
addlazy[rt]=0;
mullazy[rt]=1;
return ;
}
void build (long long rt ,long long l,long long r)
{
if(l==r){xds[rt]=a[l]%p;mullazy[l]=1%p;return ;}
long long m=(l+r)>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
push_up(rt);
}
void addchange (long long rt,long long l,long long r,long long L,long long R,long long num)
{
if(L<=l&&r<=R)
{
xds[rt]+=(r-l+1)*num%p;
addlazy[rt]+=num%p;
return ;
}
long long m=(r+l)>>1;
push_down(rt,m-l+1,r-m);
if(L<=m) addchange(rt<<1,l,m,L,R,num);
if(R>m) addchange (rt<<1|1,m+1,r,L,R,num);
push_up (rt);
return ;
}
void mulchange (long long rt,long long l,long long r,long long L,long long R,long long num)
{
if(L<=l&&r<=R)
{
xds[rt]*=num%p;
mullazy[rt]*=num%p;
return ;
}
long long m=(r+l)>>1;
push_down(rt,m-l+1,r-m);
if(L<=m) mulchange(rt<<1,l,m,L,R,num);
if(R>m) mulchange (rt<<1|1,m+1,r,L,R,num);
push_up (rt);
return ;
}
long long anns(long long rt,long long l,long long r,long long L,long long R)
{
if(L<=l&&r<=R)
{
return xds[rt];
}
long long m=(l+r)>>1;
push_down (rt,m-l+1,r-m);
long long ans=0;
if (L<=m) ans+=anns(rt<<1,l,m,L,R)%p;
if (R>m) ans+=anns(rt<<1|1,m+1,r,L,R)%p;
return ans%p;
}
int main()
{
cin>>n>>m>>p;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(long long i=1;i<=m;i++)
{
long long cc,b,c,d;
cin>>cc;
if(cc==2)
{
cin>>b>>c>>d;
addchange(1,1,n,b,c,d);
}
if(cc==1)
{
cin>>b>>c>>d;
mulchange(1,1,n,b,c,d);
}
if(cc==3)
{
cin>>b>>c;
cout<<anns(1,1,n,b,c)<<endl;
}
}
return 0;
}