1use super::super::traits::binop;
4use super::super::traits::fold;
5use super::super::traits::fold_bisect;
6use super::super::traits::get_mut;
7use super::super::traits::set_value;
8use super::super::utils::buf_range;
9
10use std::convert::From;
11use std::fmt::{self, Debug};
12use std::iter::{IntoIterator, Iterator};
13use std::ops::{Deref, DerefMut, Index, Range, RangeBounds};
14
15use binop::Monoid;
16use buf_range::{bounds_within, check_bounds, check_bounds_range};
17use fold::Fold;
18use fold_bisect::{FoldBisect, FoldBisectRev};
19use get_mut::GetMut;
20use set_value::SetValue;
21
22#[derive(Clone)]
75pub struct VecSegtree<M>
76where
77 M: Monoid,
78 M::Set: Clone,
79{
80 buf: Vec<M::Set>,
81 len: usize,
82 monoid: M,
83}
84
85impl<M> VecSegtree<M>
86where
87 M: Monoid,
88 M::Set: Clone,
89{
90 #[must_use]
91 pub fn new(len: usize) -> Self
92 where
93 M: Default,
94 {
95 let monoid = M::default();
96 Self { len, buf: vec![monoid.id(); len + len], monoid }
97 }
98
99 pub fn is_empty(&self) -> bool { self.len == 0 }
100
101 pub fn len(&self) -> usize { self.len }
102
103 fn nodes(&self, l: usize, r: usize) -> Vec<usize> {
104 let mut l = self.len + l;
105 let mut r = self.len + r;
106 let mut vl = vec![];
107 let mut vr = vec![];
108 while l < r {
109 if l & 1 == 1 {
110 vl.push(l);
111 l += 1;
112 }
113 if r & 1 == 1 {
114 r -= 1;
115 vr.push(r);
116 }
117 l >>= 1;
118 r >>= 1;
119 }
120 vr.reverse();
121 vl.append(&mut vr);
122 vl
123 }
124
125 fn nodes_rev(&self, l: usize, r: usize) -> Vec<usize> {
126 self.nodes(l, r).into_iter().rev().collect()
127 }
128}
129
130impl<M, B> Fold<B> for VecSegtree<M>
131where
132 M: Monoid,
133 M::Set: Clone,
134 B: RangeBounds<usize>,
135{
136 type Output = M;
137 fn fold(&self, b: B) -> M::Set {
138 let Range { start, end } = bounds_within(b, self.len);
139 let mut il = self.len + start;
140 let mut ir = self.len + end;
141 let mut res_l = self.monoid.id();
142 let mut res_r = self.monoid.id();
143 while il < ir {
144 if il & 1 == 1 {
145 res_l = self.monoid.op(res_l, self.buf[il].clone());
146 il += 1;
147 }
148 if ir & 1 == 1 {
149 ir -= 1;
150 res_r = self.monoid.op(self.buf[ir].clone(), res_r);
151 }
152 il >>= 1;
153 ir >>= 1;
154 }
155 self.monoid.op(res_l, res_r)
156 }
157}
158
159impl<M> SetValue<usize> for VecSegtree<M>
160where
161 M: Monoid,
162 M::Set: Clone,
163{
164 type Input = M::Set;
165 fn set_value(&mut self, i: usize, x: Self::Input) {
166 check_bounds(i, self.len);
167 *self.get_mut(i).unwrap() = x;
168 }
169}
170
171#[doc(hidden)]
172pub struct GetMutIndex<'a, M>
173where
174 M: Monoid,
175 M::Set: Clone,
176{
177 tree: &'a mut VecSegtree<M>,
178 index: usize,
179}
180
181impl<'a, M: 'a> GetMut<'a> for VecSegtree<M>
182where
183 M: Monoid,
184 M::Set: Clone,
185{
186 type Output = GetMutIndex<'a, M>;
187 fn get_mut(&'a mut self, index: usize) -> Option<GetMutIndex<'a, M>> {
188 if index < self.len {
189 Some(GetMutIndex { tree: self, index })
190 } else {
191 None
192 }
193 }
194}
195
196impl<M> Drop for GetMutIndex<'_, M>
197where
198 M: Monoid,
199 M::Set: Clone,
200{
201 fn drop(&mut self) {
202 let mut i = self.tree.len + self.index;
203 while i > 1 {
204 i >>= 1;
205 self.tree.buf[i] = self.tree.monoid.op(
206 self.tree.buf[i << 1].clone(),
207 self.tree.buf[i << 1 | 1].clone(),
208 );
209 }
210 }
211}
212
213impl<M> Deref for GetMutIndex<'_, M>
214where
215 M: Monoid,
216 M::Set: Clone,
217{
218 type Target = M::Set;
219 fn deref(&self) -> &Self::Target {
220 &self.tree.buf[self.tree.len + self.index]
221 }
222}
223
224impl<M> DerefMut for GetMutIndex<'_, M>
225where
226 M: Monoid,
227 M::Set: Clone,
228{
229 fn deref_mut(&mut self) -> &mut Self::Target {
230 &mut self.tree.buf[self.tree.len + self.index]
231 }
232}
233
234impl<M> Default for VecSegtree<M>
235where
236 M: Monoid + Default,
237 M::Set: Clone,
238{
239 fn default() -> Self { Self { buf: vec![], len: 0, monoid: M::default() } }
240}
241
242impl<M> From<Vec<M::Set>> for VecSegtree<M>
243where
244 M: Monoid + Default,
245 M::Set: Clone,
246{
247 fn from(v: Vec<M::Set>) -> Self { Self::from((v, M::default())) }
248}
249
250impl<M> From<(Vec<M::Set>, M)> for VecSegtree<M>
251where
252 M: Monoid,
253 M::Set: Clone,
254{
255 fn from((mut v, monoid): (Vec<M::Set>, M)) -> Self {
256 let len = v.len();
257 let mut buf = vec![monoid.id(); len];
258 buf.append(&mut v);
259 for i in (0..len).rev() {
260 buf[i] = monoid.op(buf[i << 1].clone(), buf[i << 1 | 1].clone());
261 }
262 Self { buf, len, monoid }
263 }
264}
265
266impl<M> Index<usize> for VecSegtree<M>
267where
268 M: Monoid,
269 M::Set: Clone,
270{
271 type Output = M::Set;
272 fn index(&self, i: usize) -> &Self::Output {
273 check_bounds(i, self.len);
274 &self.buf[i + self.len]
275 }
276}
277
278impl<M> From<VecSegtree<M>> for Vec<M::Set>
279where
280 M: Monoid,
281 M::Set: Clone,
282{
283 fn from(v: VecSegtree<M>) -> Self {
284 v.buf.into_iter().skip(v.len).collect()
285 }
286}
287
288impl<M> Debug for VecSegtree<M>
289where
290 M: Monoid,
291 M::Set: Clone + Debug,
292{
293 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
294 f.debug_list().entries(self.buf[self.len..].iter()).finish()
295 }
296}
297
298impl<M> FoldBisect for VecSegtree<M>
299where
300 M: Monoid,
301 M::Set: Clone,
302{
303 fn fold_bisect<F>(&self, l: usize, pred: F) -> (usize, M::Set)
304 where
305 F: Fn(&M::Set) -> bool,
306 {
307 check_bounds_range(l, 0..=self.len);
308
309 let mut x = self.monoid.id();
310 assert!(pred(&x), "`pred(id)` must hold");
311 match self.fold(l..) {
312 x if pred(&x) => return (self.len, x),
313 _ => {}
314 }
315
316 for v in self.nodes(l, self.len) {
317 let tmp = self.monoid.op(x.clone(), self.buf[v].clone());
318 if pred(&tmp) {
319 x = tmp;
320 continue;
321 }
322 let mut v = v;
323 while v < self.len {
324 v <<= 1;
325 let tmp = self.monoid.op(x.clone(), self.buf[v].clone());
326 if pred(&tmp) {
327 x = tmp;
328 v += 1;
329 }
330 }
331 return (v - self.len, x);
332 }
333 unreachable!();
334 }
335}
336
337impl<M> FoldBisectRev for VecSegtree<M>
338where
339 M: Monoid,
340 M::Set: Clone,
341{
342 fn fold_bisect_rev<F>(&self, r: usize, pred: F) -> (usize, M::Set)
343 where
344 F: Fn(&M::Set) -> bool,
345 {
346 check_bounds_range(r, 0..=self.len);
347
348 let mut x = self.monoid.id();
349 assert!(pred(&x), "`pred(id)` must hold");
350 match self.fold(..r) {
351 x if pred(&x) => return (0, x),
352 _ => {}
353 }
354
355 for v in self.nodes_rev(0, r) {
356 let tmp = self.monoid.op(self.buf[v].clone(), x.clone());
357 if pred(&tmp) {
358 x = tmp;
359 continue;
360 }
361 let mut v = v;
362 while v < self.len {
363 v = v << 1 | 1;
364 let tmp = self.monoid.op(self.buf[v].clone(), x.clone());
365 if pred(&tmp) {
366 x = tmp;
367 v -= 1;
368 }
369 }
370 return (v - self.len + 1, x);
371 }
372 unreachable!();
373 }
374}