#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void lan_put(ll no);
void lan_pum(ll no);
const int N = 2e5 + 10;
ll a[N] = {}, q;
struct tree {
ll l, r, n, lan_put, lan_pum;
} e[4 * N];
void buld(ll l, ll r, ll no) {
e[no].l = l;
e[no].r = r;
e[no].lan_put = 0;
e[no].lan_pum = 1;
if (l == r) {
e[no].n = a[l];
return;
}
ll mid = (l + r) >> 1;
buld(l, mid, no << 1);
buld(mid + 1, r, no << 1 | 1);
e[no].n = e[no << 1].n + e[no << 1 | 1].n;
return;
}
void lan_put(ll no) {
if (e[no].l == e[no].r)
return;
if (e[no].lan_put == 0)
return;
if (e[no << 1].lan_pum != 1)
lan_pum(no << 1);
if (e[no << 1 | 1].lan_pum != 1)
lan_pum(no << 1 | 1);
e[no << 1].n += (e[no << 1].r - e[no << 1].l + 1) * e[no].lan_put;
e[no << 1 | 1].n += (e[no << 1 | 1].r - e[no << 1 | 1].l + 1) * e[no].lan_put;
e[no<<1].lan_put+=e[no].lan_put;
e[no<<1|1].lan_put+=e[no].lan_put;
e[no].lan_put = 0;
return;
}
void lan_pum(ll no) {
if (e[no].l == e[no].r)
return;
if (e[no].lan_pum == 1)
return;
if (e[no << 1].lan_put != 0)
lan_put(no << 1);
if (e[no << 1 | 1].lan_put != 0)
lan_put(no << 1 | 1);
e[no << 1].n *= e[no].lan_pum;
e[no << 1 | 1].n *= e[no].lan_pum;
e[no << 1].lan_pum *= e[no].lan_pum;
e[no << 1 | 1].lan_pum *= e[no].lan_pum;
e[no].lan_pum = 1;
return;
}
void put(ll l, ll r, ll no, ll s) {
if (e[no].l >= l and e[no].r <= r) {
lan_pum(no);
e[no].n += (e[no].r - e[no].l + 1) * s;
e[no].lan_put += s;
return;
}
lan_put(no);
lan_pum(no);
ll mid = (e[no].l + e[no].r) >> 1;
if (l <= mid)put(l, r, no << 1, s);
if (r > mid)put(l, r, no << 1 | 1, s);
e[no].n = e[no << 1].n + e[no << 1 | 1].n;
return;
}
void pum(ll l, ll r, ll no, ll s) {
if (e[no].l >= l and e[no].r <= r) {
lan_put(no);
e[no].n *= s;
e[no].lan_pum *= s;
return;
}
lan_pum(no);
lan_put(no);
int mid = (e[no].l + e[no].r) >> 1;
if (l <= mid)pum(l, r, no << 1, s);
if (mid < r)pum(l, r, no << 1 | 1, s);
e[no].n = e[no << 1].n + e[no << 1 | 1].n;
return;
}
ll sum(ll l, ll r, ll no) {
if (e[no].l >= l and e[no].r <= r) {
return e[no].n;
}
if (e[no].lan_pum != 1)
lan_pum(no);
if (e[no].lan_put != 0)
lan_put(no);
ll x = 0, mid = (e[no].l + e[no].r) >> 1;
if (l <= mid)
x += sum(l, r, no << 1);
if (mid < r)
x += sum(l, r, no << 1 | 1);
return x;
}
int main() {
ll n, m;
scanf("%lld%lld%lld", &n, &m, &q);
for (ll i = 1; i <= n; i++)
scanf("%lld", &a[i]);
buld(1,n,1);
for (ll i = 1; i <= m; i++) {
ll x, a, b, c;
scanf("%lld", &x);
if (x == 1) {
scanf("%lld%lld%lld", &a, &b, &c);
pum(a, b, 1, c);
} else if (x == 2) {
scanf("%lld%lld%lld", &a, &b, &c);
put(a, b, 1, c);
} else {
scanf("%lld%lld", &a, &b);
printf("%lld\n", sum(a, b, 1)%q);
}
}
return 0;
}