class UnionFind: def __init__(self, size): self.parent = list(range(size)) self.rank = [0] * size def find(self, u): if self.parent[u] != u: self.parent[u] = self.find(self.parent[u]) return self.parent[u] def union(self, u, v): root_u = self.find(u) root_v = self.find(v) if root_u != root_v: if self.rank[root_u] > self.rank[root_v]: self.parent[root_v] = root_u elif self.rank[root_u] < self.rank[root_v]: self.parent[root_u] = root_v else: self.parent[root_v] = root_u self.rank[root_u] += 1 def find_visible_profiles(n, m, from_list, to_list, queries): uf = UnionFind(n + 1) for u, v in zip(from_list, to_list): uf.union(u, v) comp * (n + 1) for node in range(1, n + 1): root = uf.find(node) component_size[root] += 1 return [component_size[uf.find(query)] for query in queries]