1use super::super::traits::act;
4use super::super::traits::action;
5use super::super::traits::binop;
6use super::super::traits::fold;
7use super::super::traits::fold_bisect;
8use super::super::traits::get_mut;
9use super::super::utils::buf_range;
10
11use std::cell::RefCell;
12use std::fmt::{self, Debug};
13use std::ops::{Deref, DerefMut, Range, RangeBounds};
14
15use act::Act;
16use action::MonoidAction;
17use binop::{Identity, Magma};
18use buf_range::{bounds_within, check_bounds_range};
19use fold::Fold;
20use fold_bisect::{FoldBisect, FoldBisectRev};
21use get_mut::GetMut;
22
23const WORD_SIZE: u32 = 0_usize.count_zeros();
24
25fn lcp(i: usize, j: usize) -> usize {
26 if i == 0 || j == 0 {
27 return 0;
28 }
29 if i == j {
30 return i;
31 }
32 let (i, j) = (i.min(j), i.max(j));
33 let iz = i.leading_zeros();
34 let i = i << iz;
35 let j = j << j.leading_zeros();
36 i >> iz.max(WORD_SIZE - (i ^ j).leading_zeros())
37}
38
39#[derive(Clone, Default)]
40pub struct VecActSegtree<A>
41where
42 A: MonoidAction,
43 <A::Operator as Magma>::Set: Clone,
44 <A::Operand as Magma>::Set: Clone,
45{
46 buf: RefCell<Vec<<A::Operand as Magma>::Set>>,
47 def: RefCell<Vec<<A::Operator as Magma>::Set>>,
48 len: usize,
49 action: A,
50}
51
52impl<A> VecActSegtree<A>
53where
54 A: MonoidAction,
55 <A::Operator as Magma>::Set: Clone,
56 <A::Operand as Magma>::Set: Clone,
57{
58 #[must_use]
59 pub fn new(len: usize) -> Self
60 where
61 A: Default,
62 {
63 let action = A::default();
64 Self {
65 len,
66 buf: RefCell::new(vec![action.operand().id(); len + len]),
67 def: RefCell::new(vec![action.operator().id(); len]),
68 action,
69 }
70 }
71
72 pub fn is_empty(&self) -> bool { self.len == 0 }
73 pub fn len(&self) -> usize { self.len }
74
75 fn arch_pair(&self, l: usize, r: usize) -> (Vec<usize>, Vec<usize>) {
76 let mut l = self.len + l;
77 let mut r = self.len + r;
78 let mut vl = vec![];
79 let mut vr = vec![];
80 while l < r {
81 if l & 1 == 1 {
82 vl.push(l);
83 l += 1;
84 }
85 if r & 1 == 1 {
86 r -= 1;
87 vr.push(r);
88 }
89 l >>= 1;
90 r >>= 1;
91 }
92 (vl, vr)
93 }
94
95 fn arch(&self, l: usize, r: usize) -> Vec<usize> {
96 let (mut vl, vr) = self.arch_pair(l, r);
97 vl.extend(vr.into_iter().rev());
98 vl
99 }
100
101 fn arch_rev(&self, l: usize, r: usize) -> Vec<usize> {
102 let (vl, mut vr) = self.arch_pair(l, r);
103 vr.extend(vl.into_iter().rev());
104 vr
105 }
106
107 fn build_range(&mut self, start: usize, end: usize) {
108 let mut buf = self.buf.borrow_mut();
109 let def = self.def.borrow();
110 let action = &self.action;
111 let operand = action.operand();
112 let id = action.operator().id();
113 for i in self.ancestors_upward(start, end).filter(|&i| def[i] == id) {
114 buf[i] = operand.op(buf[i << 1].clone(), buf[i << 1 | 1].clone());
115 }
116 }
117
118 fn apply(&self, i: usize, op: <A::Operator as Magma>::Set) {
119 let mut buf = self.buf.borrow_mut();
120 let mut def = self.def.borrow_mut();
121 buf[i] = self.action.act(buf[i].clone(), op.clone());
122 if i < self.len {
123 def[i] = self.action.operator().op(def[i].clone(), op);
124 }
125 }
126
127 fn force(&self, i: usize) {
128 let e = self.action.operator().id();
129 let d = {
130 let mut def = self.def.borrow_mut();
131 std::mem::replace(&mut def[i], e.clone())
132 };
133 if d != e {
134 self.apply(i << 1, d.clone());
135 self.apply(i << 1 | 1, d);
136 }
137 }
138
139 fn parent_root(&self, i: usize) -> usize {
140 let n = self.len;
141 if n.is_power_of_two() {
142 return 0;
143 }
144 let n2 = 2 * n;
145 let lsb = n2 & n2.wrapping_neg();
146 lcp(i, if i < n2 ^ lsb { n2 ^ lsb } else { n2 })
147 }
148
149 fn ancestors_downward(
150 &self,
151 start: usize,
152 end: usize,
153 ) -> impl Iterator<Item = usize> + DoubleEndedIterator {
154 self.ancestors_upward(start, end).rev()
155 }
156
157 fn ancestors_upward(
158 &self,
159 start: usize,
160 end: usize,
161 ) -> impl Iterator<Item = usize> + DoubleEndedIterator {
162 let mut res = vec![];
165 let l = self.len + start;
166 let r = self.len + end;
167 let pl = self.parent_root(l);
168 let pr = self.parent_root(r - 1);
169
170 let mut il = 1;
171 let mut ir = 1;
172 while l >> il != pl || (r - 1) >> ir != pr {
173 if l >> il != pl {
174 if l >> il << il != l {
175 res.push(l >> il);
176 }
177 il += 1;
178 }
179 if r >> ir != pr {
180 if r >> ir << ir != r {
181 res.push((r - 1) >> ir);
182 }
183 ir += 1;
184 }
185 }
186
187 res.dedup();
188 res.into_iter()
189 }
190
191 fn force_range(&self, l: usize, r: usize) {
192 for i in self.ancestors_downward(l, r) {
193 self.force(i);
194 }
195 }
196
197 fn force_all(&self) {
198 let mut buf = self.buf.borrow_mut();
199 let mut def = self.def.borrow_mut();
200 let operator = &self.action.operator();
201 let e = operator.id();
202 for i in 1..self.len {
203 let d = std::mem::replace(&mut def[i], e.clone());
204 for &j in &[i << 1, i << 1 | 1] {
205 if j < self.len {
206 def[j] = operator.op(def[j].clone(), d.clone());
207 }
208 buf[j] = self.action.act(buf[j].clone(), d.clone());
209 }
210 }
211 }
212
213 #[cfg(test)]
214 pub fn unforced(&self) -> Vec<usize> {
215 let def = self.def.borrow();
216 let id = self.action.operator().id();
217 (0..self.len).filter(|&i| def[i] != id).collect()
218 }
219
220 #[cfg(test)]
221 pub fn ancestors_sorted(&self, start: usize, end: usize) -> Vec<usize> {
222 let mut res: Vec<_> = self.ancestors_upward(start, end).collect();
223 res.sort_unstable();
224 res
225 }
226}
227
228impl<A> From<Vec<<A::Operand as Magma>::Set>> for VecActSegtree<A>
229where
230 A: MonoidAction + Default,
231 <A::Operator as Magma>::Set: Clone,
232 <A::Operand as Magma>::Set: Clone,
233{
234 fn from(v: Vec<<A::Operand as Magma>::Set>) -> Self {
235 Self::from((v, A::default()))
236 }
237}
238
239impl<A> From<(Vec<<A::Operand as Magma>::Set>, A)> for VecActSegtree<A>
240where
241 A: MonoidAction,
242 <A::Operator as Magma>::Set: Clone,
243 <A::Operand as Magma>::Set: Clone,
244{
245 fn from((mut v, action): (Vec<<A::Operand as Magma>::Set>, A)) -> Self {
246 let len = v.len();
247 let mut buf = vec![action.operand().id(); len];
248 buf.append(&mut v);
249 for i in (0..len).rev() {
250 buf[i] = action
251 .operand()
252 .op(buf[i << 1].clone(), buf[i << 1 | 1].clone());
253 }
254 let buf = RefCell::new(buf);
255 let def = RefCell::new(vec![action.operator().id(); len]);
256 Self { buf, def, len, action }
257 }
258}
259
260impl<A> Debug for VecActSegtree<A>
261where
262 A: MonoidAction,
263 <A::Operator as Magma>::Set: Clone,
264 <A::Operand as Magma>::Set: Clone + Debug,
265{
266 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
267 self.force_all();
268 f.debug_list().entries(self.buf.borrow()[self.len..].iter()).finish()
269 }
270}
271
272impl<A> From<VecActSegtree<A>> for Vec<<A::Operand as Magma>::Set>
273where
274 A: MonoidAction,
275 <A::Operator as Magma>::Set: Clone,
276 <A::Operand as Magma>::Set: Clone,
277{
278 fn from(v: VecActSegtree<A>) -> Self {
279 v.force_all();
280 let mut res = v.buf.into_inner();
281 res.drain(..v.len);
282 res
283 }
284}
285
286impl<A, B> Fold<B> for VecActSegtree<A>
287where
288 A: MonoidAction,
289 <A::Operator as Magma>::Set: Clone,
290 <A::Operand as Magma>::Set: Clone,
291 B: RangeBounds<usize>,
292{
293 type Output = A::Operand;
294 fn fold(&self, b: B) -> <Self::Output as Magma>::Set {
295 let Range { start, end } = bounds_within(b, self.len);
296 let operand = self.action.operand();
297 if start >= end {
298 return operand.id();
299 }
300 self.force_range(start, end);
301 let mut res = operand.id();
302 let buf = self.buf.borrow();
303 for v in self.arch(start, end) {
304 res = operand.op(res, buf[v].clone());
305 }
306 res
307 }
308}
309
310impl<A, B> Act<B> for VecActSegtree<A>
311where
312 A: MonoidAction,
313 <A::Operator as Magma>::Set: Clone,
314 <A::Operand as Magma>::Set: Clone,
315 B: RangeBounds<usize>,
316{
317 type Action = A;
318 fn act(&mut self, b: B, op: <A::Operator as Magma>::Set) {
319 let Range { start, end } = bounds_within(b, self.len);
320 if start >= end {
321 return;
322 }
323 self.force_range(start, end);
324 for v in self.arch(start, end) {
325 self.apply(v, op.clone());
326 }
327 self.build_range(start, end);
328 }
329}
330
331impl<A> FoldBisect for VecActSegtree<A>
332where
333 A: MonoidAction,
334 <A::Operator as Magma>::Set: Clone,
335 <A::Operand as Magma>::Set: Clone,
336{
337 fn fold_bisect<F>(
338 &self,
339 l: usize,
340 pred: F,
341 ) -> (usize, <A::Operand as Magma>::Set)
342 where
343 F: Fn(&<A::Operand as Magma>::Set) -> bool,
344 {
345 check_bounds_range(l, 0..=self.len);
346
347 let operand = self.action.operand();
348 let mut x = operand.id();
349 assert!(pred(&x), "`pred(id)` must hold");
350 match self.fold(l..) {
351 x if pred(&x) => return (self.len, x),
352 _ => {}
353 }
354
355 self.force_range(l, self.len);
356 let buf = || self.buf.borrow();
357 for v in self.arch(l, self.len) {
358 let tmp = operand.op(x.clone(), buf()[v].clone());
359 if pred(&tmp) {
360 x = tmp;
361 continue;
362 }
363 let mut v = v;
364 while v < self.len {
365 self.force(v);
366 v <<= 1;
367 let tmp = operand.op(x.clone(), buf()[v].clone());
368 if pred(&tmp) {
369 x = tmp;
370 v += 1;
371 }
372 }
373 return (v - self.len, x);
374 }
375 unreachable!();
376 }
377}
378
379impl<A> FoldBisectRev for VecActSegtree<A>
380where
381 A: MonoidAction,
382 <A::Operator as Magma>::Set: Clone,
383 <A::Operand as Magma>::Set: Clone,
384{
385 fn fold_bisect_rev<F>(
386 &self,
387 r: usize,
388 pred: F,
389 ) -> (usize, <A::Operand as Magma>::Set)
390 where
391 F: Fn(&<A::Operand as Magma>::Set) -> bool,
392 {
393 check_bounds_range(r, 0..=self.len);
394
395 let operand = self.action.operand();
396 let mut x = operand.id();
397 assert!(pred(&x), "`pred(id)` must hold");
398 match self.fold(..r) {
399 x if pred(&x) => return (0, x),
400 _ => {}
401 }
402
403 self.force_range(0, r);
404 let buf = || self.buf.borrow();
405 for v in self.arch_rev(0, r) {
406 let tmp = operand.op(buf()[v].clone(), x.clone());
407 if pred(&tmp) {
408 x = tmp;
409 continue;
410 }
411 let mut v = v;
412 while v < self.len {
413 self.force(v);
414 v = v << 1 | 1;
415 let tmp = operand.op(buf()[v].clone(), x.clone());
416 if pred(&tmp) {
417 x = tmp;
418 v -= 1;
419 }
420 }
421 return (v - self.len + 1, x);
422 }
423 unreachable!();
424 }
425}
426
427#[doc(hidden)]
428pub struct GetMutIndex<'a, A>
429where
430 A: MonoidAction,
431 <A::Operator as Magma>::Set: Clone,
432 <A::Operand as Magma>::Set: Clone,
433{
434 tree: &'a mut VecActSegtree<A>,
435 index: usize,
436 elt: <A::Operand as Magma>::Set,
437}
438
439impl<'a, A: 'a> GetMut<'a> for VecActSegtree<A>
440where
441 A: MonoidAction,
442 <A::Operator as Magma>::Set: Clone,
443 <A::Operand as Magma>::Set: Clone,
444{
445 type Output = GetMutIndex<'a, A>;
446 fn get_mut(&'a mut self, index: usize) -> Option<GetMutIndex<'a, A>> {
447 if index >= self.len {
448 return None;
449 }
450
451 self.force_range(index, index + 1);
452 let i = self.len + index;
453 let e = self.action.operand().id();
454 let elt = std::mem::replace(&mut self.buf.borrow_mut()[i], e);
455 Some(GetMutIndex { tree: self, index, elt })
456 }
457}
458
459impl<A> Drop for GetMutIndex<'_, A>
460where
461 A: MonoidAction,
462 <A::Operator as Magma>::Set: Clone,
463 <A::Operand as Magma>::Set: Clone,
464{
465 fn drop(&mut self) {
466 let Self { index, tree, elt } = self;
467 let i = *index;
468 let elt = std::mem::replace(elt, tree.action.operand().id());
469 tree.buf.borrow_mut()[tree.len + i] = elt;
470 tree.build_range(i, i + 1);
471 }
472}
473
474impl<A> Deref for GetMutIndex<'_, A>
475where
476 A: MonoidAction,
477 <A::Operator as Magma>::Set: Clone,
478 <A::Operand as Magma>::Set: Clone,
479{
480 type Target = <A::Operand as Magma>::Set;
481 fn deref(&self) -> &Self::Target { &self.elt }
482}
483
484impl<A> DerefMut for GetMutIndex<'_, A>
485where
486 A: MonoidAction,
487 <A::Operator as Magma>::Set: Clone,
488 <A::Operand as Magma>::Set: Clone,
489{
490 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.elt }
491}
492
493#[test]
494fn test_ancestors() {
495 use op_closure::OpClosure;
496 use op_closure_on_op_closure::OpClosureOnOpClosure;
497
498 for n in 1..=100 {
499 let mut height = vec![0; n + n];
500 for i in n..n + n {
501 height[i] = 1;
502 }
503 for i in (1..n).rev() {
504 if height[i << 1] == height[i << 1 | 1] {
505 height[i] = height[i << 1] + 1;
506 }
507 }
508
509 let action = OpClosureOnOpClosure::new(
510 OpClosure::new(|_, _| (), || ()),
511 OpClosure::new(|_, _| (), || ()),
512 |_, _| (),
513 );
514 let st: VecActSegtree<_> = (vec![(); n], action).into();
515 for l in 0..n {
516 for r in l..n {
517 let arch = {
518 let mut arch = vec![];
519 let mut l = n + l;
520 let mut r = n + r + 1;
521 while l < r {
522 if l & 1 == 1 {
523 arch.push(l);
524 l += 1;
525 }
526 if r & 1 == 1 {
527 r -= 1;
528 arch.push(r);
529 }
530 l >>= 1;
531 r >>= 1;
532 }
533 arch
534 };
535
536 let mut expected = vec![];
537 for mut i in arch {
538 i >>= 1;
539 while height[i] != 0 {
540 expected.push(i);
541 i >>= 1;
542 }
543 }
544 expected.sort_unstable();
545 expected.dedup();
546
547 let actual = st.ancestors_sorted(l, r + 1);
548 assert_eq!(actual, expected);
549 }
550 }
551 }
552}
553
554#[cfg(test)]
555#[allow(dead_code)]
556fn dump(n: usize, node: &[usize]) {
557 use std::collections::BTreeSet;
558 let node: BTreeSet<_> = node.iter().copied().collect();
559
560 let len = n.next_power_of_two() << 1;
561 for i in 1..n + n {
562 let shift = WORD_SIZE - 1 - i.leading_zeros();
563 let ch = if node.contains(&i) { "o" } else { "-" };
564 eprint!("[{}]", ch.repeat((len >> shift) - 2));
565 if i + 1 == n + n || (i + 1).is_power_of_two() {
566 eprintln!();
567 }
568 }
569}
570
571#[test]
572fn test_fold_bisect() {
573 for n in (0..=32).chain(250..=260) {
574 test_fold_bisect_n(n);
575 }
576}
577
578#[cfg(test)]
579fn test_fold_bisect_n(n: usize) {
580 use op_affine_on_op_add_count::OpAffineOnOpAddCount;
581
582 let init = (1, 1);
583 let a = vec![init; n];
584 let mut st: VecActSegtree<OpAffineOnOpAddCount<i128>> = a.into();
585
586 let range_n: Vec<_> =
587 range(n).into_iter().filter_map(std::convert::identity).collect();
588
589 let actions: Vec<_> = (range_n.iter().rev())
590 .map(|&(l, r)| {
591 let range = l..r;
592 let x1 = (r - l).trailing_zeros() + 1;
593 let x0 = l;
594 (range, (x1 as i128, x0 as i128))
595 })
596 .collect();
597
598 let mut naive = vec![init; n];
599 for &(ref range, elt) in &actions {
600 for i in range.clone() {
601 let x = naive[i].0;
602 let (a, b) = elt;
603 naive[i].0 = a * x + b;
604 }
605 st.act(range.clone(), elt);
606 }
607
608 assert_eq!(st.unforced().len(), range_n.len() - n);
609 assert_eq!(Vec::<_>::from(st.clone()), naive);
610
611 let acc = {
612 let mut acc = vec![0; n + 1];
613 for i in 0..n {
614 acc[i + 1] = acc[i] + naive[i].0;
615 }
616 acc
617 };
618
619 for l in 0..=n {
620 for r in l..=n {
621 let st = st.clone();
622
623 let pred = |&(x, _): &(i128, _)| x <= acc[r] - acc[l];
624 let (index, folded) = st.fold_bisect(l, pred);
625
626 assert_eq!(
628 (index, folded),
629 (r, (acc[r] - acc[l], (r - l) as i128))
630 );
631
632 assert!(pred(&st.fold(l..index)));
634 assert!(index == n || !pred(&st.fold(l..index + 1)));
635
636 assert_eq!(Vec::<_>::from(st), naive);
638 }
639 }
640
641 for r in 0..=n {
642 for l in 0..=r {
643 let st = st.clone();
645
646 let pred = |&(x, _): &(i128, _)| x <= acc[r] - acc[l];
647 let (index, folded) = st.fold_bisect_rev(r, pred);
648
649 assert_eq!(
651 (index, folded),
652 (l, (acc[r] - acc[l], (r - l) as i128))
653 );
654
655 assert!(pred(&st.fold(index..r)));
657 assert!(index == 0 || !pred(&st.fold(index - 1..r)));
658
659 assert_eq!(Vec::<_>::from(st), naive);
661 }
662 }
663}
664
665#[cfg(test)]
666fn range(n: usize) -> Vec<Option<(usize, usize)>> {
667 let mut a = vec![None; n + n];
668 for i in 0..n {
669 a[n + i] = Some((i, i + 1));
670 }
671 for i in (1..n).rev() {
672 a[i] = match (a[2 * i], a[2 * i + 1]) {
673 (Some((ll, lr)), Some((rl, rr))) if lr == rl => Some((ll, rr)),
674 _ => None,
675 }
676 }
677 a
678}
679
680#[test]
681fn test_get_mut() {
682 for n in (0..=32).chain(1020..=1030) {
683 test_get_mut_n(n);
684 }
685}
686
687#[cfg(test)]
688fn test_get_mut_n(n: usize) {
689 use op_affine_on_op_add_count::OpAffineOnOpAddCount;
690
691 let init = (1, 1);
692 let a = vec![init; n];
693 let mut st: VecActSegtree<OpAffineOnOpAddCount<i128>> = a.into();
694
695 let range_n: Vec<_> =
696 range(n).into_iter().filter_map(std::convert::identity).collect();
697
698 let actions: Vec<_> = (range_n.iter().rev())
699 .map(|&(l, r)| {
700 let range = l..r;
701 let x1 = (r - l).trailing_zeros() + 1;
702 let x0 = l;
703 (range, (x1 as i128, x0 as i128))
704 })
705 .collect();
706
707 let mut naive = vec![init; n];
708 for &(ref range, elt) in &actions {
709 for i in range.clone() {
710 let x = naive[i].0;
711 let (a, b) = elt;
712 naive[i].0 = a * x + b;
713 }
714 st.act(range.clone(), elt);
715 }
716
717 for i in 0..n {
718 let mut st = st.clone();
720 let mut naive = naive.clone();
721
722 st.get_mut(i).unwrap().0 = 0;
723 naive[i].0 = 0;
724
725 assert_eq!(Vec::<_>::from(st), naive);
726 }
727}