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,
impl<T> ImplicitTreap<T>where
T: LazyMapMonoid,
pub fn new() -> Self
Sourcepub fn with_capacity(capacity: usize) -> Self
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
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>
impl<T, A> ImplicitTreap<T, A>
Sourcefn node(&mut self, key: T::Key) -> BstRoot<ImplicitTreapSpec<T>>
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 }Sourcefn build<I>(
&mut self,
iter: I,
) -> (Option<BstRoot<ImplicitTreapSpec<T>>>, usize)where
I: IntoIterator<Item = T::Key>,
fn build<I>(
&mut self,
iter: I,
) -> (Option<BstRoot<ImplicitTreapSpec<T>>>, usize)where
I: IntoIterator<Item = T::Key>,
Sourcefn build_bottom_up(node: BstDataMutRef<'_, ImplicitTreapSpec<T>>)
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 }pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
Sourcepub fn update<R>(&mut self, range: R, x: T::Act)where
R: RangeBounds<usize>,
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}Sourcepub fn fold<R>(&mut self, range: R) -> T::Aggwhere
R: RangeBounds<usize>,
pub fn fold<R>(&mut self, range: R) -> T::Aggwhere
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
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}Sourcepub fn reverse<R>(&mut self, range: R)where
R: RangeBounds<usize>,
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
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}pub fn get(&mut self, index: usize) -> Option<&T::Key>
pub fn modify<F>(&mut self, index: usize, f: F)
Sourcepub fn insert(&mut self, index: usize, x: T::Key)
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}Sourcepub fn remove(&mut self, index: usize) -> Option<T::Key>
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}pub fn partition_point_acc<F>(&mut self, left: usize, pred: F) -> usize
pub fn rpartition_point_acc<F>(&mut self, right: usize, pred: F) -> usize
Sourcepub fn rotate_left(&mut self, mid: usize)
pub fn rotate_left(&mut self, mid: usize)
pub fn rotate_right(&mut self, k: usize)
Trait Implementations§
Source§impl<T, A> Default for ImplicitTreap<T, A>
impl<T, A> Default for ImplicitTreap<T, A>
Source§impl<T, A> Drop for ImplicitTreap<T, A>
impl<T, A> Drop for ImplicitTreap<T, A>
Source§impl<T, A> Extend<<T as LazyMapMonoid>::Key> for ImplicitTreap<T, A>
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>,
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)
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)
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§
impl<T, A = MemoryPool<BstNode<ImplicitTreapData<T>>>> !Send for ImplicitTreap<T, A>
impl<T, A = MemoryPool<BstNode<ImplicitTreapData<T>>>> !Sync for ImplicitTreap<T, A>
impl<T, A> Freeze for ImplicitTreap<T, A>where
Option<BstNodeRef<Owned, ImplicitTreapSpec<T>>>: Freeze,
ManuallyDrop<A>: Freeze,
PhantomData<fn() -> T>: Freeze,
impl<T, A> RefUnwindSafe for ImplicitTreap<T, A>where
Option<BstNodeRef<Owned, ImplicitTreapSpec<T>>>: RefUnwindSafe,
ManuallyDrop<A>: RefUnwindSafe,
PhantomData<fn() -> T>: RefUnwindSafe,
impl<T, A> Unpin for ImplicitTreap<T, A>where
Option<BstNodeRef<Owned, ImplicitTreapSpec<T>>>: Unpin,
ManuallyDrop<A>: Unpin,
PhantomData<fn() -> T>: Unpin,
impl<T, A> UnsafeUnpin for ImplicitTreap<T, A>where
Option<BstNodeRef<Owned, ImplicitTreapSpec<T>>>: UnsafeUnpin,
ManuallyDrop<A>: UnsafeUnpin,
PhantomData<fn() -> T>: UnsafeUnpin,
impl<T, A> UnwindSafe for ImplicitTreap<T, A>where
Option<BstNodeRef<Owned, ImplicitTreapSpec<T>>>: UnwindSafe,
ManuallyDrop<A>: UnwindSafe,
PhantomData<fn() -> T>: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more