#include <bits/stdc++.h>
#define LEN (r - l + 1)
#define LC u << 1, l, mid
#define RC u << 1 | 1, mid + 1, r
#define PA u, l, r
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
enum { Add = 2, Mul = 1 };
ll sum[N << 2], add[N << 2], mul[N << 2];
int n, mod;
void update(int u, int l, int r, int c, int op) {
if (op == Add) {
add[u] = (add[u] + c) % mod;
sum[u] = (sum[u] + c * LEN) % mod;
}
else {
add[u] = (add[u] * c) % mod;
mul[u] = (mul[u] * c) % mod;
sum[u] = (sum[u] * c) % mod;
}
}
void pushdown(int u, int l, int r) {
int mid = l + r >> 1;
if (mul[u] != 1) {
update(LC, mul[u], Mul);
update(RC, mul[u], Mul);
mul[u] = 1;
}
if (add[u]) {
update(LC, add[u], Add);
update(RC, add[u], Add);
add[u] = 0;
}
}
void pushup(int u) {
sum[u] = (sum[u << 1] + sum[u << 1 | 1]) % mod;
}
void build(int u, int l, int r) {
mul[u] = 1;
if (l == r) {
ll x;
cin >> x;
sum[u] = x % mod;
}
else {
int mid = l + r >> 1;
build(LC);
build(RC);
pushup(u);
}
}
void modify(int u, int l, int r, int p, int q, int c, int op) {
if (p <= l && r <= q) {
update(PA, c, op);
}
else {
pushdown(PA);
int mid = l + r >> 1;
if (p <= mid)
modify(LC, p, q, c, op);
if (mid < q)
modify(RC, p, q, c, op);
pushup(u);
}
}
ll query(int u, int l, int r, int p, int q) {
pushdown(PA);
if (p <= l && r <= q)
return sum[u];
ll ans = 0;
int mid = l + r >> 1;
if (p <= mid)
ans = query(LC, p, q) % mod;
if (mid < q)
ans = (ans + query(RC, p, q)) % mod;
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen(".in", "r", stdin);
#else
ios::sync_with_stdio(false);
#endif
cin.tie(0);
cin >> n >> mod;
build(1, 1, n);
int m;
cin >> m;
while (m--) {
int op, l, r, c;
cin >> op;
if (op <= 2) {
cin >> l >> r >> c;
modify(1, 1, n, l, r, c, op);
}
else {
cin >> l >> r;
cout << query(1, 1, n, l, r) << "\n";
}
}
return 0;
}