Skip to main content

ImplicitTreap

Struct ImplicitTreap 

Source
pub struct ImplicitTreap<T, A = MemoryPool<BstNode<ImplicitTreapData<T>>>>{
    root: Option<BstRoot<ImplicitTreapSpec<T>>>,
    length: usize,
    rng: Xorshift,
    allocator: ManuallyDrop<A>,
    _marker: PhantomData<fn() -> T>,
}

Fields§

§root: Option<BstRoot<ImplicitTreapSpec<T>>>§length: usize§rng: Xorshift§allocator: ManuallyDrop<A>§_marker: PhantomData<fn() -> T>

Implementations§

Source§

impl<T> ImplicitTreap<T>
where T: LazyMapMonoid,

Source

pub fn new() -> Self

Source

pub fn with_capacity(capacity: usize) -> Self

Examples found in repository?
crates/library_checker/src/data_structure/range_reverse_range_sum.rs (line 18)
15pub fn range_reverse_range_sum(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, q, a: [i64; iter n]);
18    let mut seq = ImplicitTreap::<RangeSumRangeAdd<i64>>::with_capacity(n);
19    seq.extend(a);
20    for _ in 0..q {
21        sc!(query: Query);
22        match query {
23            Query::Reverse { l, r } => {
24                seq.reverse(l..r);
25            }
26            Query::Sum { l, r } => {
27                let ans = seq.fold(l..r).0;
28                pp!(ans);
29            }
30        }
31    }
32}
More examples
Hide additional examples
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 23)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source§

impl<T, A> ImplicitTreap<T, A>

Source

fn node(&mut self, key: T::Key) -> BstRoot<ImplicitTreapSpec<T>>

Examples found in repository?
crates/competitive/src/data_structure/implicit_treap.rs (line 303)
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    }
Source

fn build<I>( &mut self, iter: I, ) -> (Option<BstRoot<ImplicitTreapSpec<T>>>, usize)
where I: IntoIterator<Item = T::Key>,

Examples found in repository?
crates/competitive/src/data_structure/implicit_treap.rs (line 518)
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    }
Source

fn build_bottom_up(node: BstDataMutRef<'_, ImplicitTreapSpec<T>>)

Examples found in repository?
crates/competitive/src/data_structure/implicit_treap.rs (line 324)
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    }
Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn update<R>(&mut self, range: R, x: T::Act)
where R: RangeBounds<usize>,

Examples found in repository?
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 38)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source

pub fn fold<R>(&mut self, range: R) -> T::Agg
where R: RangeBounds<usize>,

Examples found in repository?
crates/library_checker/src/data_structure/range_reverse_range_sum.rs (line 27)
15pub fn range_reverse_range_sum(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, q, a: [i64; iter n]);
18    let mut seq = ImplicitTreap::<RangeSumRangeAdd<i64>>::with_capacity(n);
19    seq.extend(a);
20    for _ in 0..q {
21        sc!(query: Query);
22        match query {
23            Query::Reverse { l, r } => {
24                seq.reverse(l..r);
25            }
26            Query::Sum { l, r } => {
27                let ans = seq.fold(l..r).0;
28                pp!(ans);
29            }
30        }
31    }
32}
More examples
Hide additional examples
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 41)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source

pub fn reverse<R>(&mut self, range: R)
where R: RangeBounds<usize>,

Examples found in repository?
crates/library_checker/src/data_structure/range_reverse_range_sum.rs (line 24)
15pub fn range_reverse_range_sum(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, q, a: [i64; iter n]);
18    let mut seq = ImplicitTreap::<RangeSumRangeAdd<i64>>::with_capacity(n);
19    seq.extend(a);
20    for _ in 0..q {
21        sc!(query: Query);
22        match query {
23            Query::Reverse { l, r } => {
24                seq.reverse(l..r);
25            }
26            Query::Sum { l, r } => {
27                let ans = seq.fold(l..r).0;
28                pp!(ans);
29            }
30        }
31    }
32}
More examples
Hide additional examples
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 35)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source

pub fn get(&mut self, index: usize) -> Option<&T::Key>

Source

pub fn modify<F>(&mut self, index: usize, f: F)
where F: FnOnce(&T::Key) -> T::Key,

Source

pub fn insert(&mut self, index: usize, x: T::Key)

Examples found in repository?
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 29)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source

pub fn remove(&mut self, index: usize) -> Option<T::Key>

Examples found in repository?
crates/library_checker/src/data_structure/dynamic_sequence_range_affine_range_sum.rs (line 32)
19pub fn dynamic_sequence_range_affine_range_sum(reader: impl Read, writer: impl Write) {
20    prepare_io!(reader, writer);
21    sc!(n, q, a: [M; iter n]);
22
23    let mut seq = ImplicitTreap::<RangeSumRangeLinear<M>>::with_capacity(n + q);
24    seq.extend(a);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Insert { i, x } => {
29                seq.insert(i, x);
30            }
31            Query::Remove { i } => {
32                seq.remove(i);
33            }
34            Query::Reverse { l, r } => {
35                seq.reverse(l..r);
36            }
37            Query::Update { l, r, bc } => {
38                seq.update(l..r, bc);
39            }
40            Query::Fold { l, r } => {
41                pp!(seq.fold(l..r).0);
42            }
43        }
44    }
45}
Source

pub fn partition_point_acc<F>(&mut self, left: usize, pred: F) -> usize
where F: FnMut(&T::Agg) -> bool,

Source

pub fn rpartition_point_acc<F>(&mut self, right: usize, pred: F) -> usize
where F: FnMut(&T::Agg) -> bool,

Source

pub fn rotate_left(&mut self, mid: usize)

Examples found in repository?
crates/competitive/src/data_structure/implicit_treap.rs (line 505)
503    pub fn rotate_right(&mut self, k: usize) {
504        assert!(k <= self.length);
505        self.rotate_left(self.length - k);
506    }
Source

pub fn rotate_right(&mut self, k: usize)

Trait Implementations§

Source§

impl<T, A> Default for ImplicitTreap<T, A>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<T, A> Drop for ImplicitTreap<T, A>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl<T, A> Extend<<T as LazyMapMonoid>::Key> for ImplicitTreap<T, A>

Source§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = T::Key>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.