Когда имеет смысл использовать иерархическую реализацию DSU, где у каждого элемента есть свой родитель, пока он не дойдёт до представителя множества (ссылка на себя), с ранговой эвристикой + сжатием путей, перед тривиальной реализацией DSU на хэш-таблице/массиве, где find() работает за O(1) (обычный вызов contains() в хэш-таблице), а union() за O(n) (здесь можно использовать что-то вроде ранговой эвристики, чтобы при переприсваивании ключей у объекдиняемых множеств, присваивать меньшему по количеству элементов множеству новые set id, используя обычный put(setElem, newSetId))
Например, в задачах вроде
такой, всё равно придётся пройтись по каждому элементу и асимтотика у DSU с иерархической структурой будет даже чуть хуже - n^2 * A()
Видимо DSU на иерархической структуре даёт прирост, когда в алгоритме union() объединяет не 1 элемент с остальными, а множества сопоставимых размеров, тогда вроде бы есть смысл в такой организации DSU?
Хотя с другой стороны, если union'ов много, то рано или поздно структура выродится в ежа и тогда вариант с наивной реализацией будет лучше