Skip to content

Commit

Permalink
library update
Browse files Browse the repository at this point in the history
  • Loading branch information
EgorKulikov committed Oct 6, 2024
1 parent d135c84 commit 7ca216a
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions algo_lib/src/collections/treap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -610,23 +610,27 @@ impl<P: Payload> OptionTreapNode<P> {
} else if let Some(mut node) = self.0 {
node.push_down();
let left_size = node.left.size();
if at == left_size {
let mut left = Self::NONE;
swap(&mut node.left, &mut left);
let mut right = Self::NONE;
swap(&mut node.right, &mut right);
node.update();
(left, Self(Some(node)), right)
} else if at < left_size {
let (left, mid, right) = node.left.split_at_single(at);
node.left = right;
node.update();
(left, mid, Self(Some(node)))
} else {
let (left, mid, right) = node.right.split_at_single(at - left_size - 1);
node.right = left;
node.update();
(Self(Some(node)), mid, right)
match at.cmp(&left_size) {
Ordering::Less => {
let (left, mid, right) = node.left.split_at_single(at);
node.left = right;
node.update();
(left, mid, Self(Some(node)))
}
Ordering::Equal => {
let mut left = Self::NONE;
swap(&mut node.left, &mut left);
let mut right = Self::NONE;
swap(&mut node.right, &mut right);
node.update();
(left, Self(Some(node)), right)
}
Ordering::Greater => {
let (left, mid, right) = node.right.split_at_single(at - left_size - 1);
node.right = left;
node.update();
(Self(Some(node)), mid, right)
}
}
} else {
unreachable!();
Expand Down

0 comments on commit 7ca216a

Please sign in to comment.