rt,AC #1,#3,#4
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll a[400100],n,ta[100100],add[400100],multi[400100],t1,t2,t3,t4,p,m,maxx;
void broke(ll l,ll r,ll k)
{
//printf("break:%lld %lld %lld\n",l,r,k);
a[k]*=multi[k];
a[k]%=p;
a[k]+=add[k];
int mid=(l+r)/2;
if(k*2<=maxx)multi[k*2]*=multi[k],add[k*2]*=multi[k];
if(k*2+1<=maxx)multi[k*2+1]*=multi[k],add[k*2+1]*=multi[k];
if(k*2<=maxx)add[k*2]+=add[k]/(r-l+1)*(mid-l+1);
if(k*2+1<=maxx)add[k*2+1]+=add[k]/(r-l+1)*(r-mid);
add[k]=0;
multi[k]=1;
a[k]%=p;
}
ll build(ll l,ll r,ll k)
{
multi[k]=1;
maxx=max(maxx,k);
if(l==r)a[k]=ta[l];
else a[k]=build(l,(l+r)/2,k*2)+build((l+r)/2+1,r,k*2+1);
a[k]%=p;
return a[k];
}
ll sum(ll k,ll l,ll r,ll x,ll y)
{
broke(l,r,k);
//printf("sum:%lld %lld %lld %lld %lld\n",k,l,r,x,y);
if(l>r||x>y||l>y||x>r)return 0;
if(l==x&&r==y)return a[k];
ll mid=(l+r)/2;
return (sum(k*2,l,mid,x,min(y,mid))+sum(k*2+1,mid+1,r,max(x,mid+1),y))%p;
}
void addd(ll k,ll l,ll r,ll x,ll y,ll z)
{
broke(l,r,k);
//printf("add:%lld %lld %lld %lld %lld %lld\n",k,l,r,x,y,z);
if(l>r||x>y||l>y||x>r)return;
if(l==x&&r==y)
{
add[k]=z;
return;
}
if(l<=x&&y<=r)a[k]+=z;
a[k]%=p;
ll mid=(l+r)/2;
addd(k*2,l,mid,x,min(y,mid),z/(y-x+1)*(min(y,mid)-x+1)),addd(k*2+1,mid+1,r,max(x,mid+1),y,z/(y-x+1)*(y-max(x,mid+1)+1));
}
ll multii(ll k,ll l,ll r,ll x,ll y,ll z)
{
broke(l,r,k);
//printf("multi:%lld %lld %lld %lld %lld %lld\n",k,l,r,x,y,z);
if(l>r||x>y||l>y||x>r)
{
return a[k];
// printf("multi:%lld %lld %lld %lld %lld %lld return %lld\n",k,l,r,x,y,z,a[k]);
}
if(l==x&&r==y)
{
multi[k]=z;
// printf("multi:%lld %lld %lld %lld %lld %lld return %lld\n",k,l,r,x,y,z,a[k]*z);
return (a[k]*z)%p;
}
ll mid=(l+r)/2;
ll t114514=multii(k*2,l,mid,x,min(y,mid),z)+multii(k*2+1,mid+1,r,max(x,mid+1),y,z);
t114514%=p;
if(l<=x&&y<=r)
{
a[k]=t114514;
}
// printf("multi:%lld %lld %lld %lld %lld %lld return %lld\n",k,l,r,x,y,z,t114514);
return t114514;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
for(ll i=1;i<=n;++i)scanf("%lld",&ta[i]);
build(1,n,1);
while(m--)
{
scanf("%lld",&t1);
if(t1==3)
{
scanf("%lld%lld",&t2,&t3);
printf("%lld\n",sum(1,1,n,t2,t3));
}
else if(t1==2)
{
scanf("%lld%lld%lld",&t2,&t3,&t4);
addd(1,1,n,t2,t3,(t3-t2+1)*t4);
}
else
{
scanf("%lld%lld%lld",&t2,&t3,&t4);
multii(1,1,n,t2,t3,t4%p);
}
/*printf("\na[i](%lld):",maxx);
for(ll i=1;i<=maxx;++i)printf("%lld ",a[i]);
printf("\nadd[i](%lld):",maxx);
for(ll i=1;i<=maxx;++i)printf("%lld ",add[i]);
printf("\nmulti[i](%lld):",maxx);
for(ll i=1;i<=maxx;++i)printf("%lld ",multi[i]);*/
}
return 0;
}