class DSU:
    def __init__(self, V):
        self.parent = [0] * V
        self.rank = [0] * V
        
        for i in range(V):
            self.make_set(i)
    
    def make_set(self, x):
        self.parent[x] = x
        self.rank[x] = 0
    
    def find_set(self, x):
        if self.parent[x] == x:
            return x
        else:
            rep_x = self.find_set(self.parent[x])
            self.parent[x] = rep_x # Path Compression
            return rep_x
    
    def union(self, u, v):
        rep_u = self.find_set(u)
        rep_v = self.find_set(v)
        
        if rep_u != rep_v:
            # Union By Rank
            if self.rank[rep_u] > self.rank[rep_v]:
                self.parent[rep_v] = rep_u
            elif self.rank[rep_v] > self.rank[rep_u]:
                self.parent[rep_u] = rep_v
            else:
                self.parent[rep_v] = rep_u
                self.rank[rep_u] += 1
    
    def same_set(self, u, v):
        rep_u = self.find_set(u)
        rep_v = self.find_set(v)
        
        if rep_u == rep_v:
            return True
        else:
            return False
                
dsu = DSU(5)

dsu.union(0, 2)


print(dsu.same_set(0, 2))


