void update() { size = 1; subtree_value = value; if (left != NULL) { subtree_value = join_values(subtree_value, left->get_subtree_value()); size += left->size; } if (right != NULL) { subtree_value = join_values(subtree_value, right->get_subtree_value()); size += right->size; } }
T query(int a, int b) { if (!is_connected(a, b)) { throw std::runtime_error("Cannot query nodes that are not connected."); } get_uv(a, b); expose(u); u->rev = !u->rev; expose(v); return v->get_subtree_value(); }