#include <bits/stdc++.h>
using namespace std;
struct node {
long long sum, l, r, add, mul;
} t[4000000];
long long n, m, p;
long long a[4000000];
void pushup(long long rt) {
t[rt].sum = t[rt << 1].sum % p + t[rt << 1 | 1].sum % p;
t[rt].sum %= p;
}
void build(long long rt, long long l, long long r) {
t[rt].l = l, t[rt].r = r;
if (l == r) {
t[rt].sum = a[l] % p;
t[rt].sum = t[rt].sum % p;
t[rt].add = 0;
t[rt].mul = 1;
return;
}
long long mid = (l + r) >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
pushup(rt);
return;
}
void pushdown(long long rt) {
if (t[rt].mul != 1 || t[rt].add) { //
t[rt << 1].add = (t[rt << 1].add * t[rt].mul + t[rt].add) % p;
t[rt << 1 | 1].add = (t[rt << 1 | 1].add * t[rt].mul + t[rt].add) % p;
t[rt << 1].mul = (t[rt << 1].mul * t[rt].mul) % p;
t[rt << 1 | 1].mul = (t[rt << 1 | 1].mul * t[rt].mul) % p;
t[rt << 1].sum = (t[rt << 1].sum * t[rt].mul +
t[rt].add * (t[rt << 1].r - t[rt << 1].l + 1)) %
p;
t[rt << 1 | 1].sum =
(t[rt << 1 | 1].sum * t[rt].mul +
t[rt].add * (t[rt << 1 | 1].r - t[rt << 1 | 1].l + 1)) %
p;
}
t[rt].mul = 1;
t[rt].add = 0;
}
void change(long long rt, long long l, long long r, long long x) {
if (l <= t[rt].l && t[rt].r <= r) {
t[rt].add += x % p;
t[rt].add %= p;
t[rt].sum += x * (t[rt].r - t[rt].l + 1) % p;
t[rt].sum = t[rt].sum % p;
return;
}
pushdown(rt);
long long mid = (t[rt].l + t[rt].r) >> 1;
if (l <= mid) change(rt << 1, l, r, x);
if (mid < r) change(rt << 1 | 1, l, r, x);
pushup(rt);
return;
}
void change2(long long rt, long long l, long long r, long long x) {
if (l <= t[rt].l && t[rt].r <= r) {
if (t[rt].mul == 0) t[rt].mul = 1;
t[rt].mul *= x % p;
t[rt].mul %= p;
t[rt].add = x * t[rt].add % p;
t[rt].add %= p;
t[rt].sum *= x;
t[rt].sum = t[rt].sum % p;
return;
}
pushdown(rt);
long long mid = (t[rt].l + t[rt].r) >> 1;
if (l <= mid) change2(rt << 1, l, r, x);
if (mid < r) change2(rt << 1 | 1, l, r, x);
pushup(rt);
return;
}
long long query(long long rt, long long l, long long r) {
if (l > t[rt].r || t[rt].l > r) return 0;
if (l <= t[rt].l && t[rt].r <= r) {
return t[rt].sum % p;
}
pushdown(rt);
long long mid = (t[rt].l + t[rt].r) >> 1;
long long res = 0;
if (l <= mid) res += query(rt << 1, l, r);
res = res % p;
if (mid < r) res += query(rt << 1 | 1, l, r);
res = res % p;
pushup(rt);
return res;
}
int main() {
freopen("E:/Downloads/P3373_2.in", "r", stdin);
freopen("E:/Downloads/P3373.out", "w", stdout);
cin >> n >> m >> p;
for (long long i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
for (long long i = 1; i <= m; i++) {
long long f, x, y, k;
cin >> f;
if (f == 1) {
cin >> x >> y >> k;
change2(1, x, y, k);
}
if (f == 2) {
cin >> x >> y >> k;
change(1, x, y, k);
}
if (f == 3) {
cin >> x >> y;
cout << query(1, x, y) % p << endl;
}
}
}
球球了卡了三天了,有能调出来的加微信yxzlwz打钱(认真