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;
  }