#include <bits/stdc++.h>
using namespace std;
long long a[100005], b[400005], lazyadd[400005], lazymul[400005], mod;
void build(int l, int r, int pos) {
lazymul[pos] = 1;
if (l >= r) {
b[pos] = a[l] % mod;
return;
}
int mid = (l + r) / 2;
build(l, mid, pos << 1);
build(mid + 1, r, pos << 1 | 1);
b[pos] = (b[pos << 1] + b[pos << 1 | 1]) % mod;
}
void pushdown(int x, int l, int r) {
int mid = (l + r) / 2;
b[x << 1] = (b[x << 1] * lazymul[x] + 1ll * (mid - l + 1) * lazyadd[x]) % mod;
b[x << 1 | 1] = (b[x << 1 | 1] * lazymul[x] + 1ll * (r - mid) * lazyadd[x]) % mod;
lazyadd[x << 1] += lazyadd[x];
lazyadd[x << 1 | 1] += lazyadd[x];
lazymul[x << 1 | 1] *= lazymul[x];
lazymul[x << 1] *= lazymul[x];
lazyadd[x << 1] %= mod;
lazymul[x << 1 | 1] %= mod;
lazymul[x << 1] %= mod;
lazyadd[x << 1 | 1] %= mod;
lazyadd[x] = 0;
lazymul[x] = 1;
}
void addsum(int l, int r, int ll, int rr, long long k, int pos) {
if (ll <= l && r <= rr) {
b[pos] += 1ll * (r - l + 1) * k;
lazyadd[pos] += k;
b[pos] %= mod;
lazyadd[pos] %= mod;
return;
}
pushdown(pos, l, r);
int mid = (l + r) / 2;
if (ll <= mid) {
addsum(l, mid, ll, rr, k, pos << 1);
}
if (rr > mid)
addsum(mid + 1, r, ll, rr, k, pos << 1 | 1);
b[pos] = b[pos << 1] + b[pos << 1 | 1];
b[pos] %= mod;
}
void addmul(int l, int r, int ll, int rr, long long k, int pos) {
if (ll <= l && r <= rr) {
b[pos] *= k;
lazymul[pos] *= k;
lazyadd[pos] *= k;
lazyadd[pos] %= mod;
b[pos] %= mod;
lazymul[pos] %= mod;
return;
}
pushdown(pos, l, r);
int mid = (l + r) / 2;
if (ll <= mid)
addmul(l, mid, ll, rr, k, pos << 1);
if (rr > mid)
addmul(mid + 1, r, ll, rr, k, pos << 1 | 1);
b[pos] = b[pos << 1] + b[pos << 1 | 1];
b[pos] %= mod;
}
long long query(int l, int r, int ll, int rr, int pos) {
if (ll <= l && r <= rr) {
return b[pos];
}
pushdown(pos, l, r);
int mid = (l + r) / 2;
long long ans = 0;
if (ll <= mid) {
ans += query(l, mid, ll, rr, pos << 1);
}
if (rr > mid)
ans += query(mid + 1, r, ll, rr, pos << 1 | 1);
ans %= mod;
return ans;
}
int main() {
int n, q;
cin >> n >> q >> mod;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
build(1, n, 1);
for (int i = 1; i <= q; ++i) {
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if (x > y)
swap(x, y);
if (op == 2) {
long long k;
scanf("%lld", &k);
addsum(1, n, x, y, k, 1);
} else if (op == 1) {
long long k;
scanf("%lld", &k);
addmul(1, n, x, y, k, 1);
} else
printf("%lld\n", query(1, n, x, y, 1));
}
return 0;
}