from collections import defaultdict from sortedcontainers import SortedList class UnionFind: def __init__(self,n): self._n=n self._parent_size=[-1 for _ in range(n)] """マイナスならリーダーであり値は要素数。プラスなら値は親の番号。""" self._members=[SortedList([i]) for i in range(n)] def leader(self,a): """再帰的にリーダー(根)までたどり、自分の親をリーダーに置き換える。""" if self._parent_size[a]<0:return a self._parent_size[a]=self.leader(self._parent_size[a]) return self._parent_size[a] def merge(self,a,b): x,y=self.leader(a),self.leader(b) if x==y: return if abs(self._parent_size[x])