Skip to main content

competitive/data_structure/
implicit_treap.rs

1use super::{
2    Allocator, LazyMapMonoid, MemoryPool, Xorshift,
3    binary_search_tree::{
4        BstDataAccess, BstDataMutRef, BstNode, BstRoot, BstSeeker, BstSpec, EqualSide,
5        data::{self, LazyMapElement},
6        node::WithNoParent,
7        seeker::{SeekByAccCond, SeekByRaccCond, SeekBySize},
8        split::{Split, Split3},
9    },
10};
11use std::{
12    fmt::{self, Debug},
13    marker::PhantomData,
14    mem::{ManuallyDrop, replace},
15    ops::{DerefMut, RangeBounds},
16    ptr::NonNull,
17};
18
19type ImplicitTreapRoot<T> = BstRoot<ImplicitTreapSpec<T>>;
20type ImplicitTreapNode<T> = BstNode<ImplicitTreapData<T>>;
21
22pub struct ImplicitTreapSpec<T> {
23    _marker: PhantomData<fn() -> T>,
24}
25
26pub struct ImplicitTreapData<T>
27where
28    T: LazyMapMonoid,
29{
30    priority: u64,
31    value: LazyMapElement<T>,
32    size: usize,
33    rev: bool,
34}
35
36impl<T> Debug for ImplicitTreapData<T>
37where
38    T: LazyMapMonoid<Key: Debug, Agg: Debug, Act: Debug>,
39{
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        f.debug_struct("ImplicitTreapData")
42            .field("priority", &self.priority)
43            .field("value", &self.value)
44            .field("size", &self.size)
45            .field("rev", &self.rev)
46            .finish()
47    }
48}
49
50impl<T> BstDataAccess<data::marker::Size> for ImplicitTreapData<T>
51where
52    T: LazyMapMonoid,
53{
54    type Value = usize;
55
56    fn bst_data(&self) -> &Self::Value {
57        &self.size
58    }
59
60    fn bst_data_mut(&mut self) -> &mut Self::Value {
61        &mut self.size
62    }
63}
64
65impl<T> BstDataAccess<data::marker::LazyMap> for ImplicitTreapData<T>
66where
67    T: LazyMapMonoid,
68{
69    type Value = LazyMapElement<T>;
70
71    fn bst_data(&self) -> &Self::Value {
72        &self.value
73    }
74
75    fn bst_data_mut(&mut self) -> &mut Self::Value {
76        &mut self.value
77    }
78}
79
80impl<T> ImplicitTreapSpec<T>
81where
82    T: LazyMapMonoid,
83{
84    fn update_act(mut node: BstDataMutRef<'_, Self>, act: &T::Act) {
85        if T::is_act_unit(act) {
86            return;
87        }
88        T::act_operate_assign(&mut node.data_mut().value.act, act);
89        node.data_mut().value.key = T::act_key(&node.reborrow().into_data().value.key, act);
90        if let Some(agg) = T::act_agg(&node.reborrow().into_data().value.agg, act) {
91            node.data_mut().value.agg = agg;
92        } else {
93            Self::top_down(node.reborrow_datamut());
94            Self::bottom_up(node);
95        }
96    }
97
98    fn reverse(mut node: BstDataMutRef<'_, Self>) {
99        node.swap_children();
100        let data = node.data_mut();
101        T::toggle(&mut data.value.agg);
102        data.rev ^= true;
103    }
104}
105
106impl<T> BstSpec for ImplicitTreapSpec<T>
107where
108    T: LazyMapMonoid,
109{
110    type Parent = WithNoParent<Self::Data>;
111    type Data = ImplicitTreapData<T>;
112
113    fn top_down(mut node: BstDataMutRef<'_, Self>) {
114        if !T::is_act_unit(&node.reborrow().into_data().value.act) {
115            let act = replace(&mut node.data_mut().value.act, T::act_unit());
116            if let Ok(left) = node.reborrow_datamut().left().descend() {
117                Self::update_act(left, &act);
118            }
119            if let Ok(right) = node.reborrow_datamut().right().descend() {
120                Self::update_act(right, &act);
121            }
122        }
123        if node.reborrow().into_data().rev {
124            node.data_mut().rev = false;
125            if let Ok(left) = node.reborrow_datamut().left().descend() {
126                Self::reverse(left);
127            }
128            if let Ok(right) = node.reborrow_datamut().right().descend() {
129                Self::reverse(right);
130            }
131        }
132    }
133
134    fn bottom_up(mut node: BstDataMutRef<'_, Self>) {
135        let mut agg = T::single_agg(&node.reborrow().into_data().value.key);
136        let mut size = 1;
137        if let Ok(left) = node.reborrow().left().descend() {
138            let data = left.into_data();
139            agg = T::agg_operate(&data.value.agg, &agg);
140            size += data.size;
141        }
142        if let Ok(right) = node.reborrow().right().descend() {
143            let data = right.into_data();
144            agg = T::agg_operate(&agg, &data.value.agg);
145            size += data.size;
146        }
147        let data = node.data_mut();
148        data.value.agg = agg;
149        data.size = size;
150    }
151
152    fn merge(
153        left: Option<ImplicitTreapRoot<T>>,
154        right: Option<ImplicitTreapRoot<T>>,
155    ) -> Option<ImplicitTreapRoot<T>> {
156        match (left, right) {
157            (None, None) => None,
158            (None, Some(node)) | (Some(node), None) => Some(node),
159            (Some(mut left), Some(mut right)) => unsafe {
160                if left.reborrow().into_data().priority > right.reborrow().into_data().priority {
161                    Self::top_down(left.borrow_datamut());
162                    let lr = left.borrow_mut().right().take();
163                    let lr = Self::merge(lr, Some(right)).unwrap_unchecked();
164                    left.borrow_mut().right().set(lr);
165                    Self::bottom_up(left.borrow_datamut());
166                    Some(left)
167                } else {
168                    Self::top_down(right.borrow_datamut());
169                    let rl = right.borrow_mut().left().take();
170                    let rl = Self::merge(Some(left), rl).unwrap_unchecked();
171                    right.borrow_mut().left().set(rl);
172                    Self::bottom_up(right.borrow_datamut());
173                    Some(right)
174                }
175            },
176        }
177    }
178
179    fn split<Seeker>(
180        node: Option<ImplicitTreapRoot<T>>,
181        mut seeker: Seeker,
182        equal_side: EqualSide,
183    ) -> (Option<ImplicitTreapRoot<T>>, Option<ImplicitTreapRoot<T>>)
184    where
185        Seeker: BstSeeker<Spec = Self>,
186    {
187        match node {
188            None => (None, None),
189            Some(mut node) => {
190                Self::top_down(node.borrow_datamut());
191                if equal_side.goes_left(seeker.bst_seek(node.reborrow())) {
192                    unsafe {
193                        let right = node.borrow_mut().right().take();
194                        let (l, r) = Self::split(right, seeker, equal_side);
195                        if let Some(l) = l {
196                            node.borrow_mut().right().set(l);
197                        }
198                        Self::bottom_up(node.borrow_datamut());
199                        (Some(node), r)
200                    }
201                } else {
202                    unsafe {
203                        let left = node.borrow_mut().left().take();
204                        let (l, r) = Self::split(left, seeker, equal_side);
205                        if let Some(r) = r {
206                            node.borrow_mut().left().set(r);
207                        }
208                        Self::bottom_up(node.borrow_datamut());
209                        (l, Some(node))
210                    }
211                }
212            }
213        }
214    }
215}
216
217pub struct ImplicitTreap<T, A = MemoryPool<ImplicitTreapNode<T>>>
218where
219    T: LazyMapMonoid,
220    A: Allocator<ImplicitTreapNode<T>>,
221{
222    root: Option<ImplicitTreapRoot<T>>,
223    length: usize,
224    rng: Xorshift,
225    allocator: ManuallyDrop<A>,
226    _marker: PhantomData<fn() -> T>,
227}
228
229impl<T, A> Default for ImplicitTreap<T, A>
230where
231    T: LazyMapMonoid,
232    A: Allocator<ImplicitTreapNode<T>> + Default,
233{
234    fn default() -> Self {
235        Self {
236            root: None,
237            length: 0,
238            rng: Xorshift::new(),
239            allocator: ManuallyDrop::new(A::default()),
240            _marker: PhantomData,
241        }
242    }
243}
244
245impl<T, A> Drop for ImplicitTreap<T, A>
246where
247    T: LazyMapMonoid,
248    A: Allocator<ImplicitTreapNode<T>>,
249{
250    fn drop(&mut self) {
251        unsafe {
252            if let Some(root) = self.root.take() {
253                root.into_dying().drop_all(self.allocator.deref_mut());
254            }
255            ManuallyDrop::drop(&mut self.allocator);
256        }
257    }
258}
259
260impl<T> ImplicitTreap<T>
261where
262    T: LazyMapMonoid,
263{
264    pub fn new() -> Self {
265        Self::default()
266    }
267
268    pub fn with_capacity(capacity: usize) -> Self {
269        Self {
270            root: None,
271            length: 0,
272            rng: Xorshift::new(),
273            allocator: ManuallyDrop::new(MemoryPool::with_capacity(capacity)),
274            _marker: PhantomData,
275        }
276    }
277}
278
279impl<T, A> ImplicitTreap<T, A>
280where
281    T: LazyMapMonoid,
282    A: Allocator<ImplicitTreapNode<T>>,
283{
284    fn node(&mut self, key: T::Key) -> ImplicitTreapRoot<T> {
285        BstRoot::from_data(
286            ImplicitTreapData {
287                priority: self.rng.rand64(),
288                value: LazyMapElement::from_key(key),
289                size: 1,
290                rev: false,
291            },
292            self.allocator.deref_mut(),
293        )
294    }
295
296    fn build<I>(&mut self, iter: I) -> (Option<ImplicitTreapRoot<T>>, usize)
297    where
298        I: IntoIterator<Item = T::Key>,
299    {
300        let mut stack = vec![];
301        let mut len = 0;
302        for key in iter {
303            let mut cur = self.node(key).node;
304            let mut left = None;
305            unsafe {
306                while stack
307                    .last()
308                    .is_some_and(|node: &NonNull<ImplicitTreapNode<T>>| {
309                        node.as_ref().data.priority < cur.as_ref().data.priority
310                    })
311                {
312                    left = stack.pop();
313                }
314                cur.as_mut().child[0] = left;
315                if let Some(parent) = stack.last_mut() {
316                    parent.as_mut().child[1] = Some(cur);
317                }
318            }
319            stack.push(cur);
320            len += 1;
321        }
322        let root = stack.first().copied().map(BstRoot::new);
323        if let Some(mut root) = root {
324            Self::build_bottom_up(root.borrow_datamut());
325            (Some(root), len)
326        } else {
327            (None, len)
328        }
329    }
330
331    fn build_bottom_up(mut node: BstDataMutRef<'_, ImplicitTreapSpec<T>>) {
332        if let Ok(left) = node.reborrow_datamut().left().descend() {
333            Self::build_bottom_up(left);
334        }
335        if let Ok(right) = node.reborrow_datamut().right().descend() {
336            Self::build_bottom_up(right);
337        }
338        ImplicitTreapSpec::<T>::bottom_up(node);
339    }
340
341    pub fn len(&self) -> usize {
342        self.length
343    }
344
345    pub fn is_empty(&self) -> bool {
346        self.length == 0
347    }
348
349    pub fn update<R>(&mut self, range: R, x: T::Act)
350    where
351        R: RangeBounds<usize>,
352    {
353        let mut split = Split3::seek_by_size(&mut self.root, range);
354        if let Some(root) = split.mid_datamut() {
355            ImplicitTreapSpec::<T>::update_act(root, &x);
356        }
357    }
358
359    pub fn fold<R>(&mut self, range: R) -> T::Agg
360    where
361        R: RangeBounds<usize>,
362    {
363        let split = Split3::seek_by_size(&mut self.root, range);
364        split
365            .mid()
366            .map(|node| node.into_data().value.agg.clone())
367            .unwrap_or_else(T::agg_unit)
368    }
369
370    pub fn reverse<R>(&mut self, range: R)
371    where
372        R: RangeBounds<usize>,
373    {
374        let mut split = Split3::seek_by_size(&mut self.root, range);
375        if let Some(root) = split.mid_datamut() {
376            ImplicitTreapSpec::<T>::reverse(root);
377        }
378    }
379
380    pub fn get(&mut self, index: usize) -> Option<&T::Key> {
381        if index >= self.length {
382            return None;
383        }
384        let split = Split3::seek_by_size(&mut self.root, index..=index);
385        let node = split.mid()?.node;
386        drop(split);
387        Some(unsafe { &(*node.as_ptr()).data.value.key })
388    }
389
390    pub fn modify<F>(&mut self, index: usize, f: F)
391    where
392        F: FnOnce(&T::Key) -> T::Key,
393    {
394        assert!(index < self.length);
395        let mut split = Split3::seek_by_size(&mut self.root, index..=index);
396        let mut node = split.mid_datamut().unwrap();
397        ImplicitTreapSpec::<T>::top_down(node.reborrow_datamut());
398        {
399            let data = node.data_mut();
400            data.value.key = f(&data.value.key);
401        }
402        ImplicitTreapSpec::<T>::bottom_up(node);
403    }
404
405    pub fn insert(&mut self, index: usize, x: T::Key) {
406        assert!(index <= self.length);
407        let node = self.node(x);
408        if index == 0 {
409            self.root = ImplicitTreapSpec::<T>::merge(Some(node), self.root.take());
410        } else if index == self.length {
411            self.root = ImplicitTreapSpec::<T>::merge(self.root.take(), Some(node));
412        } else {
413            let mut node = Some(node);
414            let mut split = Split::new(&mut self.root, SeekBySize::new(index), EqualSide::Right);
415            split.manually_merge(|left, right| {
416                ImplicitTreapSpec::<T>::merge(
417                    ImplicitTreapSpec::<T>::merge(left, node.take()),
418                    right,
419                )
420            });
421        }
422        self.length += 1;
423    }
424
425    pub fn remove(&mut self, index: usize) -> Option<T::Key> {
426        if index >= self.length {
427            return None;
428        }
429        let mid;
430        if index == 0 {
431            let (left, right) = ImplicitTreapSpec::<T>::split(
432                self.root.take(),
433                SeekBySize::new(1),
434                EqualSide::Right,
435            );
436            mid = left;
437            self.root = right;
438        } else if index + 1 == self.length {
439            let (left, right) = ImplicitTreapSpec::<T>::split(
440                self.root.take(),
441                SeekBySize::new(index),
442                EqualSide::Right,
443            );
444            mid = right;
445            self.root = left;
446        } else {
447            let (left, rest) = ImplicitTreapSpec::<T>::split(
448                self.root.take(),
449                SeekBySize::new(index),
450                EqualSide::Right,
451            );
452            let (middle, right) =
453                ImplicitTreapSpec::<T>::split(rest, SeekBySize::new(1), EqualSide::Right);
454            mid = middle;
455            self.root = ImplicitTreapSpec::<T>::merge(left, right);
456        }
457        self.length -= 1;
458        let mut node = mid.unwrap();
459        ImplicitTreapSpec::<T>::top_down(node.borrow_datamut());
460        let data = unsafe { node.into_dying().into_data(self.allocator.deref_mut()) };
461        Some(data.value.key)
462    }
463
464    pub fn partition_point_acc<F>(&mut self, left: usize, mut pred: F) -> usize
465    where
466        F: FnMut(&T::Agg) -> bool,
467    {
468        let mut split3 = Split3::seek_by_size(&mut self.root, left..);
469        let front_size = split3
470            .left()
471            .map(|node| node.into_data().size)
472            .unwrap_or_default();
473        let split = split3.split_mid(SeekByAccCond::new(|acc| !pred(acc)), EqualSide::Right);
474        let index = split
475            .left()
476            .map(|node| node.into_data().size)
477            .unwrap_or_default();
478        front_size + index
479    }
480
481    pub fn rpartition_point_acc<F>(&mut self, right: usize, mut pred: F) -> usize
482    where
483        F: FnMut(&T::Agg) -> bool,
484    {
485        let mut split3 = Split3::seek_by_size(&mut self.root, ..right);
486        let split = split3.split_mid(SeekByRaccCond::new(|acc| !pred(acc)), EqualSide::Left);
487        split
488            .left()
489            .map(|node| node.into_data().size)
490            .unwrap_or_default()
491    }
492
493    pub fn rotate_left(&mut self, mid: usize) {
494        assert!(mid <= self.length);
495        if mid == 0 || mid == self.length {
496            return;
497        }
498        let (left, right) =
499            ImplicitTreapSpec::<T>::split(self.root.take(), SeekBySize::new(mid), EqualSide::Right);
500        self.root = ImplicitTreapSpec::<T>::merge(right, left);
501    }
502
503    pub fn rotate_right(&mut self, k: usize) {
504        assert!(k <= self.length);
505        self.rotate_left(self.length - k);
506    }
507}
508
509impl<T, A> Extend<T::Key> for ImplicitTreap<T, A>
510where
511    T: LazyMapMonoid,
512    A: Allocator<ImplicitTreapNode<T>>,
513{
514    fn extend<I>(&mut self, iter: I)
515    where
516        I: IntoIterator<Item = T::Key>,
517    {
518        let (root, len) = self.build(iter);
519        self.root = ImplicitTreapSpec::<T>::merge(self.root.take(), root);
520        self.length += len;
521    }
522}
523
524#[cfg(test)]
525mod tests {
526    use super::*;
527    use crate::{
528        algebra::{RangeChminChmaxAdd, RangeSumRangeChminChmaxAdd},
529        num::Saturating,
530        tools::{NotEmptySegment, Xorshift},
531    };
532
533    #[test]
534    fn test_implicit_treap_range_sum_chmin_chmax_add_random() {
535        const N: usize = 1_000;
536        const Q: usize = 20_000;
537        const A: i64 = 1_000;
538
539        let mut rng = Xorshift::default();
540        let mut arr: Vec<_> = (0..N).map(|_| Saturating(rng.random(0..=A))).collect();
541        let mut treap = ImplicitTreap::<RangeSumRangeChminChmaxAdd<_>>::with_capacity(N + Q);
542        treap.extend(arr.iter().copied());
543
544        assert_eq!(
545            Saturating(0),
546            ImplicitTreap::<RangeSumRangeChminChmaxAdd<Saturating<i64>>>::new()
547                .fold(..)
548                .sum
549        );
550        assert_eq!(None, treap.remove(N));
551        assert_eq!(None, treap.get(N));
552
553        for _ in 0..Q {
554            assert_eq!(arr.len(), treap.len());
555            assert_eq!(arr.is_empty(), treap.is_empty());
556            match rng.random(0..10) {
557                0 if arr.len() < N * 2 => {
558                    let i = rng.random(0..=arr.len());
559                    let x = Saturating(rng.random(0..=A));
560                    treap.insert(i, x);
561                    arr.insert(i, x);
562                }
563                1 if !arr.is_empty() => {
564                    let i = rng.random(0..arr.len());
565                    assert_eq!(arr.remove(i), treap.remove(i).unwrap());
566                }
567                2 if !arr.is_empty() => {
568                    let (l, r) = rng.random(NotEmptySegment(arr.len()));
569                    assert_eq!(
570                        arr[l..r].iter().copied().sum::<Saturating<i64>>(),
571                        treap.fold(l..r).sum
572                    );
573                }
574                3 if !arr.is_empty() => {
575                    let (l, r) = rng.random(NotEmptySegment(arr.len()));
576                    match rng.random(0..3) {
577                        0 => {
578                            let x = Saturating(rng.random(0..=A));
579                            treap.update(l..r, RangeChminChmaxAdd::chmin(x));
580                            arr[l..r].iter_mut().for_each(|a| *a = (*a).min(x));
581                        }
582                        1 => {
583                            let x = Saturating(rng.random(0..=A));
584                            treap.update(l..r, RangeChminChmaxAdd::chmax(x));
585                            arr[l..r].iter_mut().for_each(|a| *a = (*a).max(x));
586                        }
587                        _ => {
588                            let x = Saturating(rng.random(0..=A));
589                            treap.update(l..r, RangeChminChmaxAdd::add(x));
590                            arr[l..r].iter_mut().for_each(|a| *a += x);
591                        }
592                    }
593                }
594                4 if !arr.is_empty() => {
595                    let (l, r) = rng.random(NotEmptySegment(arr.len()));
596                    treap.reverse(l..r);
597                    arr[l..r].reverse();
598                }
599                5 if !arr.is_empty() => {
600                    let left = rng.random(0..=arr.len());
601                    let sum = arr[left..].iter().copied().sum::<Saturating<i64>>();
602                    let x = Saturating(rng.random(1..=sum.0.saturating_add(A)));
603                    assert_eq!(
604                        treap.partition_point_acc(left, |acc| acc.sum < x),
605                        arr[left..]
606                            .iter()
607                            .scan(Saturating(0), |acc, &a| {
608                                *acc += a;
609                                Some(*acc)
610                            })
611                            .position(|acc| acc >= x)
612                            .map_or(arr.len(), |i| i + left),
613                    );
614                }
615                6 if !arr.is_empty() => {
616                    let right = rng.random(0..=arr.len());
617                    let sum = arr[..right].iter().copied().sum::<Saturating<i64>>();
618                    let x = Saturating(rng.random(1..=sum.0.saturating_add(A)));
619                    assert_eq!(
620                        treap.rpartition_point_acc(right, |acc| acc.sum < x),
621                        arr[..right]
622                            .iter()
623                            .rev()
624                            .scan(Saturating(0), |acc, &a| {
625                                *acc += a;
626                                Some(*acc)
627                            })
628                            .position(|acc| acc >= x)
629                            .map_or(0, |i| right - i),
630                    );
631                }
632                7 => {
633                    let i = rng.random(0..=arr.len());
634                    treap.rotate_left(i);
635                    arr.rotate_left(i);
636                }
637                8 => {
638                    let i = rng.random(0..=arr.len());
639                    treap.rotate_right(i);
640                    arr.rotate_right(i);
641                }
642                _ if !arr.is_empty() => {
643                    let i = rng.random(0..arr.len());
644                    if rng.random(0..2) == 0 {
645                        assert_eq!(arr.get(i), treap.get(i));
646                    } else {
647                        let x = Saturating(rng.random(0..=A));
648                        treap.modify(i, |_| x);
649                        arr[i] = x;
650                    }
651                }
652                _ => {}
653            }
654        }
655    }
656}