#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
struct SegmentTree{
int l, r;
ll sum, add, mu;
#define _l(x) tree[x].l
#define _r(x) tree[x].r
#define _sum(x) tree[x].sum
#define _add(x) tree[x].add
#define _mu(x) tree[x].mu
} tree[N * 4];
int a[N], n, m, Mod;
void build(int p, int l, int r) {
_l(p) = l, _r(p) = r;
if (l == r) {
_sum(p) = a[l];
return;
}
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
_sum(p) = (_sum(p * 2) + _sum(p * 2 + 1)) % Mod;
}
void spread(int p) {
if (_add(p)) {
_sum(p * 2) = (ll)(_mu(p) * _sum(p * 2) + ((_r(p * 2) - _l(p * 2) + 1) * _add(p)) % Mod) % Mod;
_sum(p * 2 + 1) = (ll)(_mu(p) * _sum(p * 2 + 1) + ((_r(p * 2 + 1) - _l(p * 2 + 1) + 1) * _add(p)) % Mod) % Mod;
_mu(p * 2) = (ll)(_mu(p * 2) * _mu(p)) % Mod;
_mu(p * 2 + 1) = (ll)(_mu(p * 2 + 1) * _mu(p)) % Mod;
_add(p * 2) = (ll)(_add(p * 2) * _mu(p) + _add(p)) % Mod;
_add(p * 2 + 1) = (ll)(_add(p * 2 + 1) * _mu(p) + _add(p)) % Mod;
}
}
void change_add(int p, int l, int r, int d) {
if (l <= _l(p) && r >= _r(p)) {
_sum(p) += (ll)d * (_r(p) - _l(p) + 1);
_add(p) += d;
_sum(p) %= Mod, _add(p) %= Mod;
return;
}
spread(p);
int mid = (_l(p) + _r(p)) / 2;
if (l <= mid) change_add(p * 2, l, r, d);
if (r > mid) change_add(p * 2 + 1, l, r, d);
_sum(p) = (_sum(p * 2) + _sum(p * 2 + 1)) % Mod;
}
void change_mu(int p, int l, int r, int d) {
if (_l(p) >= l && _r(p) <= r) {
_add(p) = (_add(p) * d) % Mod;
_mu(p) = (_mu(p) * d) % Mod;
_sum(p) = (_mu(p) * d) % Mod;
return;
}
spread(p);
ll mid = (_r(p) + _l(p)) / 2;
if (l <= mid) change_mu(p * 2, l, r, d);
if (r > mid) change_mu(p * 2 + 1, l, r, d);
_sum(p) = (_sum(p * 2) + _sum(p * 2 + 1)) % Mod;
}
ll ask(int p, int l, int r) {
if (l <= _l(p) && r >= _r(p)) return _sum(p);
spread(p);
int mid = (_l(p) + _r(p)) / 2;
ll val = 0;
if (l <= mid) val += ask(p * 2, l, r);
if (r > mid) val += ask(p * 2 + 1, l, r);
val %= Mod;
return val;
}
int main() {
scanf("%d%d", &n, &m, &Mod);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
build(1, 1, n);
while (m--) {
int op, l, r, d;
scanf("%d%d%d", &op, &l, &r);
if (op == 1) {
scanf("%d", &d);
change_mu(1, l, r, d);
}
if (op == 2) {
scanf("%d", &d);
change_add(1, l, r, d);
}
else printf("%lld\n", ask(1, l, r));
}
return 0;
}