6 struct alignas(32)
Node {
16 while (
n < (
int)vc.size())
n <<= 1,
log++;
18 for (ll i = 0; i < (
int)vc.size(); ++i) {
19 v[i + n].sum = v[i + n].g1 = v[i + n].l1 = vc[i];
21 for (ll i =
n - 1; i; --i) update(i);
24 void range_chmin(
int l,
int r, ll x) { inner_apply<1>(l, r, x); }
26 void range_chmax(
int l,
int r, ll x) { inner_apply<2>(l, r, x); }
28 void range_add(
int l,
int r, ll x) { inner_apply<3>(l, r, x); }
32 ll
range_min(
int l,
int r) {
return inner_fold<1>(l, r); }
34 ll
range_max(
int l,
int r) {
return inner_fold<2>(l, r); }
36 ll
range_sum(
int l,
int r) {
return inner_fold<3>(l, r); }
41 Node& l = v[k * 2 + 0];
42 Node& r = v[k * 2 + 1];
65 void push_add(
int k, ll x) {
67 p
.sum += x << (
log + __builtin_clz(k) - 31);
74 void push_min(
int k, ll x) {
81 void push_max(
int k, ll x) {
91 push_add(k * 2 + 0, p
.add);
92 push_add(k * 2 + 1, p
.add);
95 if (p.g1 < v[k * 2 + 0].g1) push_min(k * 2 + 0, p
.g1);
96 if (p.l1 > v[k * 2 + 0].l1) push_max(k * 2 + 0, p
.l1);
97 if (p.g1 < v[k * 2 + 1].g1) push_min(k * 2 + 1, p
.g1);
98 if (p.l1 > v[k * 2 + 1].l1) push_max(k * 2 + 1, p
.l1);
100 void subtree_chmin(
int k, ll x) {
101 if (v[k].g1 <= x)
return;
107 subtree_chmin(k * 2 + 0, x);
108 subtree_chmin(k * 2 + 1, x);
111 void subtree_chmax(
int k, ll x) {
112 if (x <= v[k].l1)
return;
118 subtree_chmax(k * 2 + 0, x);
119 subtree_chmax(k * 2 + 1, x);
123 inline void _apply(
int k, ll x) {
124 if constexpr (cmd == 1) subtree_chmin(k, x);
125 if constexpr (cmd == 2) subtree_chmax(k, x);
126 if constexpr (cmd == 3) push_add(k, x);
127 if constexpr (cmd == 4) subtree_chmin(k, x), subtree_chmax(k, x);
130 void inner_apply(
int l,
int r, ll x) {
133 for (
int i =
log; i >= 1; i--) {
134 if (((l >> i) << i) != l) push(l >> i);
135 if (((r >> i) << i) != r) push((r - 1) >> i);
140 if (l & 1) _apply<cmd>(l++, x);
141 if (r & 1) _apply<cmd>(--r, x);
148 for (
int i = 1; i <=
log; i++) {
149 if (((l >> i) << i) != l) update(l >> i);
150 if (((r >> i) << i) != r) update((r - 1) >> i);
155 if constexpr (cmd == 1)
return INFL;
156 if constexpr (cmd == 2)
return -
INFL;
160 inline void op(ll& a,
const Node& b) {
161 if constexpr (cmd == 1) a = min(a, b
.l1);
162 if constexpr (cmd == 2) a = max(a, b
.g1);
163 if constexpr (cmd == 3) a += b
.sum;
166 ll inner_fold(
int l,
int r) {
167 if (l == r)
return e<cmd>();
169 for (
int i =
log; i >= 1; i--) {
170 if (((l >> i) << i) != l) push(l >> i);
171 if (((r >> i) << i) != r) push((r - 1) >> i);
173 ll lx = e<cmd>(), rx = e<cmd>();
175 if (l & 1) op<cmd>(lx, v[l++]);
176 if (r & 1) op<cmd>(rx, v[--r]);
180 if constexpr (cmd == 1) lx = min(lx, rx);
181 if constexpr (cmd == 2) lx = max(lx, rx);
182 if constexpr (cmd == 3) lx += rx;