class LockingTree:
def __init__(self, parent: List[int]):
self.parent = parent
self.child = [[] for _ in range(len(parent))]
self.locked = [0] * len(parent)
for node in range(1, len(parent)):
self.child[parent[node]].append(node)
def lock(self, num: int, user: int) -> bool:
if self.locked[num]:
return False
self.locked[num] = user
return True
def unlock(self, num: int, user: int) -> bool:
if self.locked[num] != user:
return False
self.locked[num] = 0
return True
def upgrade(self, num: int, user: int) -> bool:
node = num
while node != -1:
if self.locked[node]:
return False
node = self.parent[node]
def dfs(node):
lockedCount = 0
if self.locked[node]:
lockedCount += 1
self.locked[node] = 0
for nei in self.child[node]:
lockedCount += dfs(nei)
return lockedCount
if dfs(num) > 0:
self.locked[num] = user
return True
return Falseclass LockingTree:
def __init__(self, parent: List[int]):
self.parent = parent
self.child = [[] for _ in range(len(parent))]
self.locked = [0] * len(parent)
for node in range(1, len(parent)):
self.child[parent[node]].append(node)
def lock(self, num: int, user: int) -> bool:
if self.locked[num]:
return False
self.locked[num] = user
return True
def unlock(self, num: int, user: int) -> bool:
if self.locked[num] != user:
return False
self.locked[num] = 0
return True
def upgrade(self, num: int, user: int) -> bool:
node = num
while node != -1:
if self.locked[node]:
return False
node = self.parent[node]
lockedCount, q = 0, deque([num])
while q:
node = q.popleft()
if self.locked[node]:
self.locked[node] = 0
lockedCount += 1
q.extend(self.child[node])
if lockedCount:
self.locked[num] = user
return True
return Falseclass LockingTree:
def __init__(self, parent: List[int]):
self.parent = parent
self.child = [[] for _ in range(len(parent))]
self.locked = [0] * len(parent)
for node in range(1, len(parent)):
self.child[parent[node]].append(node)
def lock(self, num: int, user: int) -> bool:
if self.locked[num]:
return False
self.locked[num] = user
return True
def unlock(self, num: int, user: int) -> bool:
if self.locked[num] != user:
return False
self.locked[num] = 0
return True
def upgrade(self, num: int, user: int) -> bool:
node = num
while node != -1:
if self.locked[node]:
return False
node = self.parent[node]
lockedCount, stack = 0, [num]
while stack:
node = stack.pop()
if self.locked[node]:
self.locked[node] = 0
lockedCount += 1
stack.extend(self.child[node])
if lockedCount:
self.locked[num] = user
return True
return False