#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,q,m,a[1000006],st[4000006],lz[4000006];
void UPDATE(int id, int l, int r, int u, int v, int x)
{
if (l>v || r<u) return;
else if (l>=u && r<=v)
{
st[id]+=x*(r-l+1),lz[id]+=x;
return;
}
int mid=(l+r)/2;
st[id*2]+=lz[id]*(mid-l+1),lz[id*2]+=lz[id],st[id*2+1]+=(r-mid)*lz[id],lz[id*2+1]+=lz[id],lz[id]=0;
UPDATE(id*2,l,mid,u,v,x),UPDATE(id*2+1,mid+1,r,u,v,x);
st[id]=st[id*2]+st[id*2+1];
}
int GET(int id, int l, int r, int u, int v)
{
if (l>v || r<u) return 0;
else if (l>=u && r<=v) return st[id];
int mid=(l+r)/2;
st[id*2]+=lz[id]*(mid-l+1),lz[id*2]+=lz[id],st[id*2+1]+=(r-mid)*lz[id],lz[id*2+1]+=lz[id],lz[id]=0;
return GET(id*2,l,mid,u,v)+GET(id*2+1,mid+1,r,u,v);
}
signed main()
{
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>q>>m;
for (int i=1;i<=n;i++) cin>>a[i],UPDATE(1,1,n,i,i,a[i]);
for (int i=1;i<=q;i++)
{
int t;
cin>>t;
if (t==1)
{
int l,r,x;
cin>>l>>r>>x;
UPDATE(1,1,n,l,r,x);
}
else
{
int l,r;
cin>>l>>r;
cout<<GET(1,1,n,l,r)%m<<'\n';
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbixxLG0sYVsxMDAwMDA2XSxzdFs0MDAwMDA2XSxsels0MDAwMDA2XTsKdm9pZCBVUERBVEUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHgpCnsKICAgIGlmIChsPnYgfHwgcjx1KSByZXR1cm47CiAgICBlbHNlIGlmIChsPj11ICYmIHI8PXYpCiAgICB7CiAgICAgICAgc3RbaWRdKz14KihyLWwrMSksbHpbaWRdKz14OwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQ9KGwrcikvMjsKICAgIHN0W2lkKjJdKz1seltpZF0qKG1pZC1sKzEpLGx6W2lkKjJdKz1seltpZF0sc3RbaWQqMisxXSs9KHItbWlkKSpseltpZF0sbHpbaWQqMisxXSs9bHpbaWRdLGx6W2lkXT0wOwogICAgVVBEQVRFKGlkKjIsbCxtaWQsdSx2LHgpLFVQREFURShpZCoyKzEsbWlkKzEscix1LHYseCk7CiAgICBzdFtpZF09c3RbaWQqMl0rc3RbaWQqMisxXTsKfQppbnQgR0VUKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpCnsKICAgIGlmIChsPnYgfHwgcjx1KSByZXR1cm4gMDsKICAgIGVsc2UgaWYgKGw+PXUgJiYgcjw9dikgcmV0dXJuIHN0W2lkXTsKICAgIGludCBtaWQ9KGwrcikvMjsKICAgIHN0W2lkKjJdKz1seltpZF0qKG1pZC1sKzEpLGx6W2lkKjJdKz1seltpZF0sc3RbaWQqMisxXSs9KHItbWlkKSpseltpZF0sbHpbaWQqMisxXSs9bHpbaWRdLGx6W2lkXT0wOwogICAgcmV0dXJuIEdFVChpZCoyLGwsbWlkLHUsdikrR0VUKGlkKjIrMSxtaWQrMSxyLHUsdik7Cn0Kc2lnbmVkIG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKSxjaW4udGllKDApLGNvdXQudGllKDApOwogICAgY2luPj5uPj5xPj5tOwogICAgZm9yIChpbnQgaT0xO2k8PW47aSsrKSBjaW4+PmFbaV0sVVBEQVRFKDEsMSxuLGksaSxhW2ldKTsKICAgIGZvciAoaW50IGk9MTtpPD1xO2krKykKICAgIHsKICAgICAgICBpbnQgdDsKICAgICAgICBjaW4+PnQ7CiAgICAgICAgaWYgKHQ9PTEpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbCxyLHg7CiAgICAgICAgICAgIGNpbj4+bD4+cj4+eDsKICAgICAgICAgICAgVVBEQVRFKDEsMSxuLGwscix4KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW50IGwscjsKICAgICAgICAgICAgY2luPj5sPj5yOwogICAgICAgICAgICBjb3V0PDxHRVQoMSwxLG4sbCxyKSVtPDwnXG4nOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9