class DisjoinSet: def __init__(self, n): self.rank = [0] * n self.parent = [i for i in range(n)] def union_sets(self, a, b): a = self.find_set(a) b = self.find_set(b) if a != b: if self.rank[a] < self.rank[b]: a, b = b, a self.parent[b] = a if self.rank[a] == self.rank[b]: self.rank[a] += 1 def find_set(self, v): if v == self.parent[v]: return v self.parent[v] = self.find_set(self.parent[v]) return self.parent[v]