원래 트리의 엣지들을 추가하면서 새로운 형태의 트리를 만든다.
현재 추가된 엣지의 가중치가, 새 트리에서는 노드에 매핑되어 저장된다. 그리고 그 노드가 지금 합쳐진 컴포넌트들의 LCA가 되도록 트리를 만드는 것이다.
엣지가 추가되면서 노드들이 연결되어서 컴포넌트들로 뭉쳐질것이다. 이 컴포넌트들은 각각의 트리로 표현될텐데, 그때의 루트 노드를 따로 저장해놓는다. 이제 (u,v)엣지를 추가한다면, 새 트리에서는 u와 v에 엣지를 연결하는 것이 아니라, u가 속한 컴포넌트의 루트노드와 v가 속한 컴포넌트의 루트노드를 연결해주게 된다. 이것도 그대로 연결하는 것이 아니라.. 새로운 노드 p를 하나 추가해서 그 노드가 u의 루트노드와 v의 루트노드의 공통 부모가 되게 한다. 이러면 p는 합쳐진 컴포넌트의 루트노드가 된다. 그리고 p에 현재 추가된 엣지의 가중치를 매핑시켜 저장한다
이렇게 트리를 다 만들고 나면, u와 v가 연결된 시점의 가중치는 u와 v의 LCA노드에 매핑된 값이 된다.
결국 원래 트리에서의 경로 최솟값 쿼리를, 새 트리에서의 LCA 쿼리로 처리할수 있다.
n개의 엣지를 dsu로 추가하면서 새 트리를 만드는데에는 O(n*α(n))이 걸린다.
트리에서 LCA 쿼리를 처리하는 것은 HLD를 사용했을때 전처리 O(n), Q개 쿼리를 처리하는 것에 O(Qlogn)가 걸린다. RMQ로 변환해서 Sparse table을 써서 한다면, 구축에 O(nlogn), Q개쿼리 처리에 O(Q)가 된다.
암튼 총 시간 복잡도는 O(n*α(n) + Qlogn) 또는 O(n*α(V) + Q + nlogn) 이다