void Invert(int a, int b) { int size = (b - a + 1) >> 1; Ptr B = Get(a); Ptr A = B->left_child; B->left_child = nullptr; B->CalculateSize(); Ptr C = Get(size << 1); Ptr D = C->right_child; C->right_child = nullptr; C->CalculateSize(); B = Get(size); Ptr E = B->right_child; E->parent = nullptr; B->right_child = D; if (D) D->parent = B; B->CalculateSize(); C->right_child = B; B->parent = C; C->CalculateSize(); C = Min(E); C->left_child = A; if (A) A->parent = C; C->CalculateSize(); }
Ptr BuildFromSortedVector( const std::vector<int>& v, int s, int e, Ptr parent) { if(e - s <= 0) return nullptr; int m = (s + e) >> 1; Ptr u = new Node(v[m]); u->parent = parent; u->left_child = BuildFromSortedVector(v, s, m, u); u->right_child = BuildFromSortedVector(v, m + 1, e, u); u->CalculateSize(); return u; }