#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,q,tree[500005],lazysum[500005],lazychen[500005],a[500005];
ll ls(ll h)
{
return h*2;
}
ll rs(ll h)
{
return h*2+1;
}
ll build(ll l,ll r,ll h)
{
lazychen[h]=1;lazysum[h]=0;
if(l==r)
{
tree[h]=a[l]%m;return 0;
}
ll mid=(l+r)>>1;
build(l,mid,ls(h));
build(mid+1,r,rs(h));
tree[h]=(tree[ls(h)]+tree[rs(h)])%m;
return 0;
}
ll push_up(ll h)
{
tree[h]=(tree[ls(h)]+tree[rs(h)])%m;return 0;
}
ll f(ll l,ll r,ll h,ll k1,ll k2)
{
tree[h]=(tree[h]*k1+k2*(r-l+1))%m;
lazychen[h]*=k1%m,lazysum[h]=(lazysum[h]*k1+k2)%m;
return 0;
}
ll push_down(ll l,ll r,ll h)
{
ll mid=(l+r)>>1;
f(l,mid,ls(h),lazychen[h],lazysum[h]);
f(mid+1,r,rs(h),lazychen[h],lazysum[h]);
lazychen[h]=1,lazysum[h]=0;
return 0;
}
ll chen(ll l,ll r,ll s,ll t,ll h,ll k)
{
if(l>=s&&r<=t)
{
tree[h]=((tree[h]%m)*k)%m;
lazychen[h]*=k%m,lazysum[h]*=k%m;return 0;
}
push_down(l,r,h);
ll mid=(l+r)>>1;
if(mid>=s) chen(l,mid,s,t,ls(h),k);
if(mid<t) chen(mid+1,r,s,t,rs(h),k);
push_up(h);
return 0;
}
ll add(ll l,ll r,ll s,ll t,ll h,ll k)
{
//printf("%lld %lld %lld %lld\n",l,r,h,k);
if(l>=s&&r<=t)
{
tree[h]=((tree[h]%m)+k*(r-l+1))%m;
lazysum[h]=(lazysum[h]+k)%m;return 0;
}
push_down(l,r,h);
ll mid=(l+r)>>1;
if(mid>=s) add(l,mid,s,t,ls(h),k);
if(mid<t) add(mid+1,r,s,t,rs(h),k);
push_up(h);
return 0;
}
ll getsum(ll l,ll r,ll s,ll t,ll h)
{
//printf("%lld %lld %lld %lld\n",l,r,h,tree[h]);
if(l>=s&&r<=t) return tree[h];
push_down(l,r,h);
ll ans=0,mid=(l+r)>>1;
if(mid>=s) ans+=getsum(l,mid,s,t,ls(h));
if(mid<t) ans+=getsum(mid+1,r,s,t,rs(h));
return (ans%m);
}
int main()
{
scanf("%lld %lld %lld",&n,&q,&m);
//for(int i=1;i<=100005;i++) lazychen[i]=1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,n,1);
for(int i=1;i<=q;i++)
{
ll op,x,y,k;
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
chen(1,n,x,y,1,k);
}
if(op==2)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(1,n,x,y,1,k);
}
if(op==3)
{
scanf("%lld%lld",&x,&y);
ll ans=getsum(1,n,x,y,1);
ans=ans%m;
printf("%lld\n",ans);
}
}
return 0;
}
求调