아이디어는 간단하다. Q개의 쿼리에 대해서 parallel binary search를 한다. pbs에 대해서는 jason9319님의 설명을 참조하자. 간단히 설명하자면, 원래 [lo, hi]를 관리하던 걸 [lo[0], hi[0]], ... , [lo[Q-1], hi[Q-1]]을 관리하는 걸로 문제를 바꿨다고 생각하면 된다.
PBS를 한 번 돌릴 때마다 Union-find를 계속 simulate한다. 체크할 쿼리가 있는 시점에 멈춰서 두 정점이 연결되어 있는지를 체크해주면 된다.
3. Union-find Tree + LCA : \(Q\lg V + E\lg V\)
이 풀이는 무려 online이다! 갓풀이가 그렇듯 약간의 테크닉 + 쩌는 관찰로 구성되어 있다.
union-find를 할 때 실제로 merge를 수행하는 간선은 MST에 사용되는 N-1개 뿐이다.
똑같이 uf tree를 만드는데, 정점의 가중치는 무조건 부모 노드 > 자식 노드이도록 merge해주는 거다.
즉, rank compression 없이 path compression만 사용한다. path나 rank 중 하나만 해도 \(\lg V\) 시간복잡도가 보장된다고 한다. 개꿀!