实在是不太懂了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 10;
ll a[maxn], sum[maxn << 2], tag[maxn << 2];
ll ls(ll rt) {
return rt << 1;
}
ll rs(ll rt) {
return rt << 1 | 1;
}
void Adda(ll rt, ll l, ll r, ll d) {
sum[rt] += d * (r - l + 1);
tag[rt] += d;
}
void Addp(ll rt, ll d) {
sum[rt] *= d;
tag[rt] *= d;
}
void Push_up(ll rt) {
sum[rt] = sum[ls(rt)] + sum[rs(rt)];
}
void Push_down_a(ll rt, ll l, ll r) {
if (tag[rt]) {
ll mid = (l + r) >> 1;
Adda(ls(rt), l, mid, tag[rt]);
Adda(rs(rt), mid + 1, r, tag[rt]);
tag[rt] = 0;
}
}
void Push_down_p(ll rt) {
if (tag[rt]) {
Addp(ls(rt), tag[rt]);
tag[rt] = 0;
}
}
void Build(ll rt, ll l, ll r) {
if (l == r) {
sum[rt] = a[l];
return;
}
ll mid = (l + r) >> 1;
Build(ls(rt), l, mid);
Build(rs(rt), mid + 1, r);
Push_up(rt);
}
void Modify_Add(ll rt, ll l, ll r, ll L, ll R, ll d) {
if (L <= l && r <= R) {
Adda(rt, l, r, d);
return;
}
Push_down_a(rt, l, r);
ll mid = (l + r) >> 1;
if (L <= mid) {
Modify_Add(ls(rt), l, mid, L, R, d);
}
if (R > mid) {
Modify_Add(rs(rt), mid + 1, r, L, R, d);
}
Push_up(rt);
}
void Modify_Pdd(ll rt, ll l, ll r, ll L, ll R, ll d) {
if (L <= l && r <= R) {
Addp(rt, d);
return;
}
Push_down_p(rt);
ll mid = (l + r) >> 1;
if (L <= mid) {
Modify_Pdd(ls(rt), l, mid, L, R, d);
}
if (R > mid) {
Modify_Pdd(rs(rt), mid + 1, r, L, R, d);
}
Push_up(rt);
}
ll Ask(ll rt, ll l, ll r, ll L, ll R) {
if (L <= l && r <= R) {
return sum[rt];
}
Push_down_a(rt, l, r);
ll mid = (l + r) >> 1;
ll res = 0;
if (L <= mid) {
res += Ask(rt << 1, l, mid, L, R);
}
if (R > mid) {
res += Ask(rt << 1 | 1, mid + 1, r, L, R);
}
return res;
}
int main() {
ll n, q, m;
scanf("%lld%lld%lld", &n, &q, &m);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
Build(1, 1, n);
while (q--) {
ll z, x, y, k;
scanf("%lld", &z);
if (z == 1) {
scanf("%lld%lld%lld", &x, &y, &k);
Modify_Pdd(1, 1, n, x, y, k);
Push_down_p(1);
} else if (z == 2) {
scanf("%lld%lld%lld", &x, &y, &k);
Modify_Add(1, 1, n, x, y, k);
Push_down_a(1, 1, n);
} else {
scanf("%lld%lld", &x, &y);
printf("%lld\n", Ask(1, 1, n, x, y) % m);
}
}
return 0;
}