@@ -40,14 +40,14 @@ struct lazy_segtree {
40
40
for (int i = 1 ; i <= log ; i++) update (p >> i);
41
41
}
42
42
43
- S get (int p) {
43
+ S get (int p) const {
44
44
assert (0 <= p && p < _n);
45
45
p += size;
46
46
for (int i = log ; i >= 1 ; i--) push (p >> i);
47
47
return d[p];
48
48
}
49
49
50
- S prod (int l, int r) {
50
+ S prod (int l, int r) const {
51
51
assert (0 <= l && l <= r && r <= _n);
52
52
if (l == r) return e ();
53
53
@@ -70,7 +70,7 @@ struct lazy_segtree {
70
70
return op (sml, smr);
71
71
}
72
72
73
- S all_prod () { return d[1 ]; }
73
+ S all_prod () const { return d[1 ]; }
74
74
75
75
void apply (int p, F f) {
76
76
assert (0 <= p && p < _n);
@@ -109,10 +109,10 @@ struct lazy_segtree {
109
109
}
110
110
}
111
111
112
- template <bool (*g)(S)> int max_right (int l) {
112
+ template <bool (*g)(S)> int max_right (int l) const {
113
113
return max_right (l, [](S x) { return g (x); });
114
114
}
115
- template <class G > int max_right (int l, G g) {
115
+ template <class G > int max_right (int l, G g) const {
116
116
assert (0 <= l && l <= _n);
117
117
assert (g (e ()));
118
118
if (l == _n) return _n;
@@ -138,10 +138,10 @@ struct lazy_segtree {
138
138
return _n;
139
139
}
140
140
141
- template <bool (*g)(S)> int min_left (int r) {
141
+ template <bool (*g)(S)> int min_left (int r) const {
142
142
return min_left (r, [](S x) { return g (x); });
143
143
}
144
- template <class G > int min_left (int r, G g) {
144
+ template <class G > int min_left (int r, G g) const {
145
145
assert (0 <= r && r <= _n);
146
146
assert (g (e ()));
147
147
if (r == 0 ) return 0 ;
@@ -169,15 +169,15 @@ struct lazy_segtree {
169
169
170
170
private:
171
171
int _n, size, log ;
172
- std::vector<S> d;
173
- std::vector<F> lz;
172
+ mutable std::vector<S> d;
173
+ mutable std::vector<F> lz;
174
174
175
175
void update (int k) { d[k] = op (d[2 * k], d[2 * k + 1 ]); }
176
- void all_apply (int k, F f) {
176
+ void all_apply (int k, F f) const {
177
177
d[k] = mapping (f, d[k]);
178
178
if (k < size) lz[k] = composition (f, lz[k]);
179
179
}
180
- void push (int k) {
180
+ void push (int k) const {
181
181
all_apply (2 * k, lz[k]);
182
182
all_apply (2 * k + 1 , lz[k]);
183
183
lz[k] = id ();
0 commit comments