17 std::vector<T> lazy_tag;
18 void build(
const std::vector<T> &a,
int s,
int t,
int p)
25 int m = s + ((t - s) >> 1);
26 build(a, s, m, p * 2), build(a, m + 1, t, p * 2 + 1);
27 d[p] = d[p * 2] + d[(p * 2) + 1];
29 T _range_sum(
int l,
int r,
int s,
int t,
int p)
33 int m = s + ((t - s) >> 1),
sum = 0;
36 sum += _range_sum(l, r, s, m, p * 2);
38 sum += _range_sum(l, r, m + 1, t, p * 2 + 1);
41 void maintain(
int cl,
int cr,
int p)
43 int cm = cl + (cr - cl) / 2;
44 if (cl != cr && lazy_tag[p])
46 lazy_tag[p * 2] += lazy_tag[p];
47 lazy_tag[p * 2 + 1] += lazy_tag[p];
48 d[p * 2] += lazy_tag[p] * (cm - cl + 1);
49 d[p * 2 + 1] += lazy_tag[p] * (cr - cm);
53 void _range_set(
int l,
int r, T val,
int cl,
int cr,
int p)
55 if (l <= cl && cr <= r)
58 d[p] = (cr - cl + 1) * val;
61 int m = cl + (cr - cl) / 2;
64 _range_set(l, r, val, cl, m, p * 2);
66 _range_set(l, r, val, m + 1, cr, p * 2 + 1);
67 d[p] = d[p * 2] + d[p * 2 + 1];
69 void _range_add(
int l,
int r, T val,
int cl,
int cr,
int p)
71 if (l <= cl && cr <= r)
74 d[p] += (cr - cl + 1) * val;
77 int m = cl + (cr - cl) / 2;
80 _range_add(l, r, val, cl, m, p * 2);
82 _range_add(l, r, val, m + 1, cr, p * 2 + 1);
83 d[p] = d[p * 2] + d[p * 2 + 1];
89 auto vector_size = n << 2;
90 d = std::vector<T>(vector_size);
91 lazy_tag = std::vector<T>(vector_size, 0);
92 build(a, 0, n - 1, 1);
101 return _range_sum(left, right, 0, n - 1, 1);
110 void range_set(
int left,
int right, T value) { _range_set(left, right, value, 0, n - 1, 1); }
118 void range_add(
int left,
int right, T value) { _range_add(left, right, value, 0, n - 1, 1); }