Я бы писал нечто в таком стиле
Подвешиваем дерево за корень
Находим поддерево размера sqrt(N)
Отфильтровываем запросы, где одна из вершин в поддереве и где обе в поддереве
вторую группу можно пробрутить,
первая - подготовка для каждой вершины из поддерева отсортированного массива "путь до корня поддерева" и один dfs из корня наружу с поддержанием списка в сбалансированном дереве
Шаг n log n, шагов sqrt(n)