64 size_t remove(
const T& x) {
66 root = remove(root, x, top);
72 void join_sorted_all_greater(
const std::vector<T>& v) {
74 if (v.size() == 0) {
return; }
78 v, 0,
static_cast<int64_t
>(v.size() - 1),
nullptr,
'0'
85 if (root ==
nullptr) {
91 if (root->tree_size == 1) {
92 tree_node *r = insert(
nullptr, n,
'0', root->key);
96 else if (n->tree_size == 1) {
97 tree_node *r = insert(
nullptr, root,
'0', n->key);
103 root = (root->height >= n->height ?
104 join_taller(root, n) :
105 join_shorter(root, n));
129 uint64_t tree_size = 0;
137 tree_node *parent =
nullptr;
139 tree_node *left =
nullptr;
140 tree_node *right =
nullptr;
142 void compute_height() noexcept {
145 (left !=
nullptr ?
static_cast<int64_t
>(left->height) : -1);
148 (right !=
nullptr ?
static_cast<int64_t
>(right->height) : -1);
150 height =
static_cast<uint64_t
>(std::max(lh, rh)) + 1;
153 void compute_size() noexcept {
154 const uint64_t ls = (left !=
nullptr ? left->tree_size : 0);
155 const uint64_t rs = (right !=
nullptr ? right->tree_size : 0);
156 tree_size = 1 + ls + rs;
158 void update() noexcept {
163 void link_parent_to(tree_node *n) {
164 if (n ==
nullptr) {
return; }
165 if (parent !=
nullptr) {
169 else if (side ==
'r') {
178 uint64_t left_size() const noexcept {
179 return (left ==
nullptr ? 0 : left->tree_size);
182 uint64_t right_size() const noexcept {
183 return (right ==
nullptr ? 0 : right->tree_size);
192 tree_node *root =
nullptr;
198 void free_node(tree_node *n) {
213 tree_node *right_rotation(tree_node *_n) {
215 assert(_n !=
nullptr);
219 tree_node *P = A->parent;
220 tree_node *B = A->left;
223 assert(B !=
nullptr);
229 if (A->side ==
'r') {
232 else if (A->side ==
'l') {
247 tree_node *E = B->right;
264 tree_node *left_rotation(tree_node *_n) {
266 assert(_n !=
nullptr);
270 tree_node *A = B->right;
273 A->parent = B->parent;
275 if (B->side ==
'r') {
276 B->parent->right = A;
278 else if (B->side ==
'l') {
290 tree_node *E = A->left;
308 tree_node *left_left_case(tree_node *n) {
309 return right_rotation(n);
312 tree_node *left_right_case(tree_node *n) {
313 n->left = left_rotation(n->left);
314 return right_rotation(n);
317 tree_node *right_right_case(tree_node *n) {
318 return left_rotation(n);
321 tree_node *right_left_case(tree_node *n) {
322 n->right = right_rotation(n->right);
323 return left_rotation(n);
327 tree_node *balance(tree_node *n) {
328 if (n ==
nullptr) {
return nullptr; }
330 assert(std::abs(n->bf) <= 2);
333 if (std::abs(n->bf) <= 1) {
return n; }
336 (n->left->bf <= 0 ? left_left_case(n) : left_right_case(n)) :
337 (n->right->bf >= 0 ? right_right_case(n) : right_left_case(n))
374 tree_node *insert(tree_node *p, tree_node *n,
char s,
const T& x) {
401 n->left = insert(n, n->left,
'l', x);
404 n->right = insert(n, n->right,
'r', x);
416 tree_node *remove_leftmost(tree_node *n, T *k =
nullptr) {
417 if (n->left ==
nullptr) {
423 tree_node *r = n->right;
424 n->link_parent_to(r);
429 n->left = remove_leftmost(n->left, k);
434 tree_node *remove_rightmost(tree_node *n, T *k =
nullptr) {
435 if (n->right ==
nullptr) {
441 tree_node *l = n->left;
442 n->link_parent_to(l);
448 n->right = remove_rightmost(n->right, k);
460 tree_node *remove(tree_node *n,
const T& x, uint64_t& on_top) {
468 on_top += n->right_size() + 1;
469 n->left = remove(n->left, x, on_top);
476 n->right = remove(n->right, x, on_top);
486 on_top += n->right_size();
489 tree_node *L = n->left;
490 tree_node *R = n->right;
491 if (L ==
nullptr and R ==
nullptr) {
496 if (L !=
nullptr and R ==
nullptr) {
497 n->link_parent_to(L);
502 if (L ==
nullptr and R !=
nullptr) {
503 n->link_parent_to(R);
516 if (L->height > R->height) {
518 while (lL->right !=
nullptr) {
522 n->left = remove(L, lL->key, dummy);
526 while (sR->left !=
nullptr) {
530 n->right = remove(R, sR->key, dummy);
547 tree_node *join_taller(tree_node *T1, tree_node *T2) {
549 assert(T1 !=
nullptr);
550 assert(T2 !=
nullptr);
551 assert(T1->tree_size > 1 and T2->tree_size > 1);
555 tree_node *x =
new tree_node();
557 assert(x !=
nullptr);
561 T2 = remove_leftmost(T2, &(x->key));
565 const uint64_t h = T2->height;
567 uint64_t hp = v->height;
568 while (hp > h + 1 and v !=
nullptr) {
569 hp = (v->bf == -1 ? hp - 2 : hp - 1);
574 assert(v !=
nullptr);
578 tree_node *u = v->parent;
599 while (u->parent !=
nullptr) {
605 assert(u !=
nullptr);
617 tree_node *join_shorter(tree_node *T1, tree_node *T2) {
619 assert(T1 !=
nullptr);
620 assert(T2 !=
nullptr);
621 assert(T1->tree_size > 1 and T2->tree_size > 1);
625 tree_node *x =
new tree_node();
627 assert(x !=
nullptr);
631 T1 = remove_rightmost(T1, &(x->key));
635 const uint64_t h = T1->height;
637 uint64_t hp = v->height;
638 while (hp > h + 1 and v !=
nullptr) {
639 hp = (v->bf == -1 ? hp - 2 : hp - 1);
643 assert(v !=
nullptr);
647 tree_node *u = v->parent;
667 while (u->parent !=
nullptr) {
673 assert(u !=
nullptr);
684 tree_node *_make_tree(
685 const std::vector<T>& v,
686 int64_t l, int64_t r, tree_node *p,
char s
689 if (l > r) {
return nullptr; }
690 const int64_t m = (l + r)/2;
696 tree_node *n =
new tree_node();
697 n->key = v[
static_cast<uint64_t
>(m)];
703 n->left = _make_tree(v, l, m - 1, n,
'l');
704 n->right = _make_tree(v, m + 1, r, n,
'r');
Main namespace of the library.
Definition definitions.hpp:48