/**
* Binary Search Tree
*/
#[derive(Debug)]
enum BinarySearchTree<T> {
Bin(
usize, // size
i64, // priority
T, // value
Box<BinarySearchTree<T>>,
Box<BinarySearchTree<T>>,
),
Tip,
}
// https://w...content-available-to-author-only...e.net/iwiwi/2-12188757
impl<T: Ord> BinarySearchTree<T> {
pub fn singleton(v: T, pri: i64) -> Self {
use BinarySearchTree::*;
Bin(1, pri, v, Box::new(Tip), Box::new(Tip))
}
pub fn size(&self) -> usize {
use BinarySearchTree::*;
match *self {
Bin(t, _, _, _, _) => t,
Tip => 0,
}
}
// Merges two BST. Their ownership is taken.
pub fn merge(left: Self, right: Self) -> Self {
use BinarySearchTree::*;
match (left, right) {
(Tip, Tip) => Tip,
(Tip, x) => x,
(x, Tip) => x,
(Bin(lsize, lpri, lelem, lleft, lright),
Bin(rsize, rpri, relem, rleft, rright)) => {
if lpri > rpri {
let right = Bin(rsize, rpri, relem, rleft, rright);
let mut ret = Bin(lsize, lpri, lelem, lleft,
Box::new(Self::merge(*lright, right)));
ret.update();
ret
} else {
let left = Bin(lsize, lpri, lelem, lleft, lright);
let mut ret = Bin(rsize, rpri, relem,
Box::new(Self::merge(left, *rleft)),
rright);
ret.update();
ret
}
}
}
}
pub fn split(self, k: usize) -> (Self, Self) {
use BinarySearchTree::*;
match self {
Tip => (Tip, Tip),
Bin(size, pri, elem, left, right) => {
if k <= left.size() {
let (sl, sr) = Self::split(*left, k);
let mut ret = Bin(size, pri, elem, Box::new(sr), right);
ret.update();
(sl, ret)
} else {
let (sl, sr) = Self::split(*right, k - left.size() - 1);
let mut ret = Bin(size, pri, elem, left, Box::new(sl));
ret.update();
(ret, sr)
}
}
}
}
fn update(&mut self) {
use BinarySearchTree::*;
match *self {
Tip => (),
Bin(ref mut lsize, ref _pri, ref _elem, ref left, ref right) => {
*lsize = left.size() + right.size() + 1;
},
}
}
fn insert_at(self, v: T, pri: i64, k: usize) -> Self {
let sing = Self::singleton(v, pri);
let (left, right) = self.split(k);
let tmp = Self::merge(left, sing);
Self::merge(tmp, right)
}
fn erase_at(self, k: usize) -> Self {
let (left, singright) = self.split(k);
let (sing, right) = singright.split(1);
assert_eq!(sing.size(), 1);
Self::merge(left, right)
}
fn find_index(&self, t: &T) -> (usize, bool) {
use BinarySearchTree::*;
use std::cmp::Ordering;
match *self {
Tip => (0, false),
Bin(_, _, ref elem, ref left, ref right) => {
match elem.cmp(t) {
Ordering::Equal => (left.size(), true),
Ordering::Less =>
left.find_index(t),
Ordering::Greater => {
let (idx, found) = right.find_index(t);
(idx + left.size() + 1, found)
},
}
}
}
}
fn insert(self, v: T, pri: i64) -> Self {
let (idx, found) = self.find_index(&v);
if found {
self
} else {
self.insert_at(v, pri, idx)
}
}
fn erase(self, v: &T) -> Self {
let (idx, found) = self.find_index(v);
if found {
self.erase_at(idx)
} else {
self
}
}
}
fn depth<T>(t: &BinarySearchTree<T>) -> usize {
match *t {
BinarySearchTree::Tip => 0,
BinarySearchTree::Bin(_, _, _, ref left, ref right) => {
std::cmp::max(depth(left), depth(right)) + 1
}
}
}
fn main() {
let mut bst = BinarySearchTree::Tip::<usize>;
let mut seed: i64 = 0xdeadc0de;
let mut next = || {
seed = seed.wrapping_mul(0x12345678deadc0d1).wrapping_add(0x1551);
seed
};
const N: usize = 10000;
for _ in 0 .. 1000 { next(); }
let mut cur_depth = 0;
for i in 0 .. N {
bst = bst.insert(i, next());
let dep = depth(&bst);
if cur_depth != dep {
println!("i = {}, depth = {}", i, dep);
cur_depth = dep;
}
}
}
Ci8qKgogKiBCaW5hcnkgU2VhcmNoIFRyZWUKICovCiNbZGVyaXZlKERlYnVnKV0KZW51bSBCaW5hcnlTZWFyY2hUcmVlPFQ+IHsKICAgIEJpbigKICAgICAgICB1c2l6ZSwgLy8gc2l6ZQogICAgICAgIGk2NCwgLy8gcHJpb3JpdHkKICAgICAgICBULCAvLyB2YWx1ZQogICAgICAgIEJveDxCaW5hcnlTZWFyY2hUcmVlPFQ+PiwKICAgICAgICBCb3g8QmluYXJ5U2VhcmNoVHJlZTxUPj4sCiAgICApLAogICAgVGlwLAp9CgovLyBodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUubmV0L2l3aXdpLzItMTIxODg3NTcKaW1wbDxUOiBPcmQ+IEJpbmFyeVNlYXJjaFRyZWU8VD4gewogICAgcHViIGZuIHNpbmdsZXRvbih2OiBULCBwcmk6IGk2NCkgLT4gU2VsZiB7CiAgICAgICAgdXNlIEJpbmFyeVNlYXJjaFRyZWU6Oio7CiAgICAgICAgQmluKDEsIHByaSwgdiwgQm94OjpuZXcoVGlwKSwgQm94OjpuZXcoVGlwKSkKICAgIH0KICAgIHB1YiBmbiBzaXplKCZzZWxmKSAtPiB1c2l6ZSB7CiAgICAgICAgdXNlIEJpbmFyeVNlYXJjaFRyZWU6Oio7CiAgICAgICAgbWF0Y2ggKnNlbGYgewogICAgICAgICAgICBCaW4odCwgXywgIF8sIF8sIF8pID0+IHQsCiAgICAgICAgICAgIFRpcCA9PiAwLAogICAgICAgIH0KICAgIH0KICAgIC8vIE1lcmdlcyB0d28gQlNULiBUaGVpciBvd25lcnNoaXAgaXMgdGFrZW4uCiAgICBwdWIgZm4gbWVyZ2UobGVmdDogU2VsZiwgcmlnaHQ6IFNlbGYpIC0+IFNlbGYgewogICAgICAgIHVzZSBCaW5hcnlTZWFyY2hUcmVlOjoqOwogICAgICAgIG1hdGNoIChsZWZ0LCByaWdodCkgewogICAgICAgICAgICAoVGlwLCBUaXApID0+IFRpcCwKICAgICAgICAgICAgKFRpcCwgeCkgPT4geCwKICAgICAgICAgICAgKHgsIFRpcCkgPT4geCwKICAgICAgICAgICAgKEJpbihsc2l6ZSwgbHByaSwgbGVsZW0sIGxsZWZ0LCBscmlnaHQpLAogICAgICAgICAgICAgQmluKHJzaXplLCBycHJpLCByZWxlbSwgcmxlZnQsIHJyaWdodCkpID0+IHsKICAgICAgICAgICAgICAgIGlmIGxwcmkgPiBycHJpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSBCaW4ocnNpemUsIHJwcmksIHJlbGVtLCBybGVmdCwgcnJpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBsZXQgbXV0IHJldCA9IEJpbihsc2l6ZSwgbHByaSwgbGVsZW0sIGxsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94OjpuZXcoU2VsZjo6bWVyZ2UoKmxyaWdodCwgcmlnaHQpKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0LnVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIHJldAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IEJpbihsc2l6ZSwgbHByaSwgbGVsZW0sIGxsZWZ0LCBscmlnaHQpOwogICAgICAgICAgICAgICAgICAgIGxldCBtdXQgcmV0ID0gQmluKHJzaXplLCBycHJpLCByZWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g6Om5ldyhTZWxmOjptZXJnZShsZWZ0LCAqcmxlZnQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycmlnaHQpOwogICAgICAgICAgICAgICAgICAgIHJldC51cGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICByZXQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHB1YiBmbiBzcGxpdChzZWxmLCBrOiB1c2l6ZSkgLT4gKFNlbGYsIFNlbGYpIHsKICAgICAgICB1c2UgQmluYXJ5U2VhcmNoVHJlZTo6KjsKICAgICAgICBtYXRjaCBzZWxmIHsKICAgICAgICAgICAgVGlwID0+IChUaXAsIFRpcCksCiAgICAgICAgICAgIEJpbihzaXplLCBwcmksIGVsZW0sIGxlZnQsIHJpZ2h0KSA9PiB7CiAgICAgICAgICAgICAgICBpZiBrIDw9IGxlZnQuc2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgKHNsLCBzcikgPSBTZWxmOjpzcGxpdCgqbGVmdCwgayk7CiAgICAgICAgICAgICAgICAgICAgbGV0IG11dCByZXQgPSBCaW4oc2l6ZSwgcHJpLCBlbGVtLCBCb3g6Om5ldyhzciksIHJpZ2h0KTsKICAgICAgICAgICAgICAgICAgICByZXQudXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgKHNsLCByZXQpCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCAoc2wsIHNyKSA9IFNlbGY6OnNwbGl0KCpyaWdodCwgayAtIGxlZnQuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IG11dCByZXQgPSBCaW4oc2l6ZSwgcHJpLCBlbGVtLCBsZWZ0LCBCb3g6Om5ldyhzbCkpOwogICAgICAgICAgICAgICAgICAgIHJldC51cGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAocmV0LCBzcikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZuIHVwZGF0ZSgmbXV0IHNlbGYpIHsKICAgICAgICB1c2UgQmluYXJ5U2VhcmNoVHJlZTo6KjsKICAgICAgICBtYXRjaCAqc2VsZiB7CiAgICAgICAgICAgIFRpcCA9PiAoKSwKICAgICAgICAgICAgQmluKHJlZiBtdXQgbHNpemUsIHJlZiBfcHJpLCByZWYgX2VsZW0sIHJlZiBsZWZ0LCByZWYgcmlnaHQpID0+IHsKICAgICAgICAgICAgICAgICpsc2l6ZSA9IGxlZnQuc2l6ZSgpICsgcmlnaHQuc2l6ZSgpICsgMTsKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICB9CiAgICBmbiBpbnNlcnRfYXQoc2VsZiwgdjogVCwgcHJpOiBpNjQsIGs6IHVzaXplKSAtPiBTZWxmIHsKICAgICAgICBsZXQgc2luZyA9IFNlbGY6OnNpbmdsZXRvbih2LCBwcmkpOwogICAgICAgIGxldCAobGVmdCwgcmlnaHQpID0gc2VsZi5zcGxpdChrKTsKICAgICAgICBsZXQgdG1wID0gU2VsZjo6bWVyZ2UobGVmdCwgc2luZyk7CiAgICAgICAgU2VsZjo6bWVyZ2UodG1wLCByaWdodCkKICAgIH0KICAgIGZuIGVyYXNlX2F0KHNlbGYsIGs6IHVzaXplKSAtPiBTZWxmIHsKICAgICAgICBsZXQgKGxlZnQsIHNpbmdyaWdodCkgPSBzZWxmLnNwbGl0KGspOwogICAgICAgIGxldCAoc2luZywgcmlnaHQpID0gc2luZ3JpZ2h0LnNwbGl0KDEpOwogICAgICAgIGFzc2VydF9lcSEoc2luZy5zaXplKCksIDEpOwogICAgICAgIFNlbGY6Om1lcmdlKGxlZnQsIHJpZ2h0KQogICAgfQogICAgZm4gZmluZF9pbmRleCgmc2VsZiwgdDogJlQpIC0+ICh1c2l6ZSwgYm9vbCkgewogICAgICAgIHVzZSBCaW5hcnlTZWFyY2hUcmVlOjoqOwogICAgICAgIHVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7CiAgICAgICAgbWF0Y2ggKnNlbGYgewogICAgICAgICAgICBUaXAgPT4gKDAsIGZhbHNlKSwKICAgICAgICAgICAgQmluKF8sIF8sIHJlZiBlbGVtLCByZWYgbGVmdCwgcmVmIHJpZ2h0KSA9PiB7CiAgICAgICAgICAgICAgICBtYXRjaCBlbGVtLmNtcCh0KSB7CiAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6OkVxdWFsID0+IChsZWZ0LnNpemUoKSwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6Okxlc3MgPT4KICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC5maW5kX2luZGV4KHQpLAogICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOjpHcmVhdGVyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChpZHgsIGZvdW5kKSA9IHJpZ2h0LmZpbmRfaW5kZXgodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIChpZHggKyBsZWZ0LnNpemUoKSArIDEsIGZvdW5kKQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmbiBpbnNlcnQoc2VsZiwgdjogVCwgcHJpOiBpNjQpIC0+IFNlbGYgewogICAgICAgIGxldCAoaWR4LCBmb3VuZCkgPSBzZWxmLmZpbmRfaW5kZXgoJnYpOwogICAgICAgIGlmIGZvdW5kIHsKICAgICAgICAgICAgc2VsZgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0X2F0KHYsIHByaSwgaWR4KQogICAgICAgIH0KICAgIH0KICAgIGZuIGVyYXNlKHNlbGYsIHY6ICZUKSAtPiBTZWxmIHsKICAgICAgICBsZXQgKGlkeCwgZm91bmQpID0gc2VsZi5maW5kX2luZGV4KHYpOwogICAgICAgIGlmIGZvdW5kIHsKICAgICAgICAgICAgc2VsZi5lcmFzZV9hdChpZHgpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VsZgogICAgICAgIH0KICAgIH0KfQoKZm4gZGVwdGg8VD4odDogJkJpbmFyeVNlYXJjaFRyZWU8VD4pIC0+IHVzaXplIHsKICAgIG1hdGNoICp0IHsKICAgICAgICBCaW5hcnlTZWFyY2hUcmVlOjpUaXAgPT4gMCwKICAgICAgICBCaW5hcnlTZWFyY2hUcmVlOjpCaW4oXywgXywgXywgcmVmIGxlZnQsIHJlZiByaWdodCkgPT4gewogICAgICAgICAgICBzdGQ6OmNtcDo6bWF4KGRlcHRoKGxlZnQpLCBkZXB0aChyaWdodCkpICsgMQogICAgICAgIH0KICAgIH0KfQoKZm4gbWFpbigpIHsKICAgIGxldCBtdXQgYnN0ID0gQmluYXJ5U2VhcmNoVHJlZTo6VGlwOjo8dXNpemU+OwogICAgbGV0IG11dCBzZWVkOiBpNjQgPSAweGRlYWRjMGRlOwogICAgbGV0IG11dCBuZXh0ID0gfHwgewogICAgICAgIHNlZWQgPSBzZWVkLndyYXBwaW5nX211bCgweDEyMzQ1Njc4ZGVhZGMwZDEpLndyYXBwaW5nX2FkZCgweDE1NTEpOwogICAgICAgIHNlZWQKICAgIH07CiAgICBjb25zdCBOOiB1c2l6ZSA9IDEwMDAwOwogICAgZm9yIF8gaW4gMCAuLiAxMDAwIHsgbmV4dCgpOyB9CiAgICBsZXQgbXV0IGN1cl9kZXB0aCA9IDA7CiAgICBmb3IgaSBpbiAwIC4uIE4gewogICAgICAgIGJzdCA9IGJzdC5pbnNlcnQoaSwgbmV4dCgpKTsKICAgICAgICBsZXQgZGVwID0gZGVwdGgoJmJzdCk7CiAgICAgICAgaWYgY3VyX2RlcHRoICE9IGRlcCB7CiAgICAgICAgICAgIHByaW50bG4hKCJpID0ge30sIGRlcHRoID0ge30iLCBpLCBkZXApOwogICAgICAgICAgICBjdXJfZGVwdGggPSBkZXA7CiAgICAgICAgfQogICAgfQp9Cg==