Изменения
dist(x) = min(dist(x.right), dist(x.left))+1 исправлено на dist(x) = dist(x.right)+1 (правая ветвь стала меньше на предыдущем шаге)→merge
'''if''' dist(x.right) > dist(x.left):
swap(x.left, x.right)
dist(x) = min(dist(x.left), dist(x.right)) + 1 <font color=darkgreen>// пересчитаем расстояние до ближайшей свободной позиции</font>
'''return''' x
<font color=darkgreen>// Каждый раз идем из уже существующей вершины только в правое поддерево {{---}} не более логарифма вызовов (по лемме)</font>