18 explicit SegTree(
const vector<T> &a) : n(int(a.size())) {
25 v = vector<T>(2 * size, T::id());
26 for (
int i = 0; i < n; i++) {
29 for (
int i = size - 1; i >= 1; i--) {
34 void set(
int p, T x) {
35 assert(0 <= p && p < n);
38 for (
int i = 1; i <= log; i++) {
44 assert(0 <= p && p < n);
53 assert(0 <= l && r <= n);
58 T sml = T::id(), smr = T::id();
60 for (; l < r; i++, l >>= 1, r >>= 1) {
62 sml = sml.merge(v[l++]);
65 smr = v[--r].merge(smr);
68 return sml.merge(smr);
74 return max_right(l, [](T x) {
return pred(x); });
80 assert(0 <= l && l <= n);
81 assert(pred(T::id()));
91 if (!pred(sm.merge(v[l]))) {
94 if (pred(sm.merge(v[l]))) {
103 }
while ((l & -l) != l);
108 return min_left(r, [](T x) {
return pred(x); });
113 assert(-1 <= r && r <= n);
117 assert(pred(T::id()));
122 while (r > 1 && (r % 2)) {
125 if (!pred(v[r].merge(sm))) {
128 if (pred(v[r].merge(sm))) {
136 }
while ((r & -r) != r);
144 void update(
int k) { v[k] = v[2 * k].merge(v[2 * k + 1]); }
SegTree()
Definition segtree.hpp:16
int max_right(int l, P pred)
Definition segtree.hpp:79
void set(int p, T x)
Definition segtree.hpp:34
int min_left(int r)
Definition segtree.hpp:107
int min_left(int r, P pred)
Definition segtree.hpp:112
T all_query()
Definition segtree.hpp:71
SegTree(const vector< T > &a)
Definition segtree.hpp:18
T get(int p)
Definition segtree.hpp:43
T query(int l, int r)
Definition segtree.hpp:49
int max_right(int l)
Definition segtree.hpp:73
SegTree(int n)
Definition segtree.hpp:17