2076. Process Restricted Friend Requests

You are given an integer n indicating the number of people in a network. Each person is labeled from 0 to n - 1.

You are also given a 0-indexed 2D integer array restrictions, where restrictions[i] = [xi, yi] means that person xi and person yi cannot become friends,either directly or indirectly through other people.

Initially, no one is friends with each other. You are given a list of friend requests as a 0-indexed 2D integer array requests, where requests[j] = [uj, vj] is a friend request between person uj and person vj.

A friend request is successful if uj and vj can be friends. Each friend request is processed in the given order (i.e., requests[j] occurs before requests[j + 1]), and upon a successful request, uj and vj become direct friends for all future friend requests.

Return a boolean array result, where each result[j] is true if the jth friend request is successful or false if it is not.

Note: If uj and vj are already direct friends, the request is still successful.

def friendRequests(self, n: int, restrictions: List[List[int]], requests: List[List[int]]) -> List[bool]:          
    uf = UnionFind(n) 
        
    restrictions = set([tuple(x) for x in restrictions]) 
                
    for a, b in requests: 
        pa, pb = uf.find(a), uf.find(b) 
        copy = list(restrictions)  # This is an optimization to shorten the restriction list 
        for c, d in copy: 
            pc, pd = uf.find(c), uf.find(d) 
            restrictions.remove((c, d))  # Need to remove first then add in case (c, d)== (pc, pd) 
            restrictions.add((pc, pd)) 
            if (pa, pb) == (pc, pd) or (pa, pb) == (pd, pc): 
                res.append(False) 
                break 
        else: 
            res.append(True) 
            uf.union(a, b) 
                                
    return res