3
def __init__(self, parent: List[int]):4
self.p = collections.defaultdict(lambda: -2)5
self.c = collections.defaultdict(list)6
for i, p in enumerate(parent):9
self.user = collections.defaultdict(set)10
self.node = collections.defaultdict(lambda: -2)12
def lock(self, num: int, user: int) -> bool:13
if self.node[num] == -2:14
self.user[user].add(num)19
def unlock(self, num: int, user: int) -> bool:20
if self.node[num] == user:22
self.user[user].remove(num)26
def upgrade(self, num: int, user: int) -> bool:27
if self.node[num] != -2:29
if not self.has_locked_descendant(num):31
if self.has_locked_ancester(num):34
self.unlock_descendant(num)37
def has_locked_descendant(39
): # function to check if alteast one desendent is lock or not41
for child in self.c[num]:42
if self.node[child] != -2:44
has |= self.has_locked_descendant(child)47
def has_locked_ancester(self, num): # function to check if no parent is locked50
if self.node[self.p[num]] != -2:52
return self.has_locked_ancester(self.p[num])54
def unlock_descendant(self, num): # function fro unlocking all desendents55
for child in self.c[num]:56
if child in self.node:57
user = self.node[child]60
self.user[user].remove(child)61
self.unlock_descendant(child)