3
unordered_map<int, vector<int>> descendents;4
vector<vector<int>> Node;7
Node[i][1] = -1; (means unlocked)8
Node[i][1] = x; (means locked by user x)11
LockingTree(vector<int> &parent) {13
Node.resize(n, vector<int>(2, -1));15
Node[0][0] = -1; // root has no parent16
for (int i = 1; i < n; i++) {17
Node[i][0] = parent[i];18
descendents[parent[i]].push_back(i);22
bool lock(int num, int user) {23
if (Node[num][1] != -1) return false;29
bool unlock(int num, int user) {30
if (Node[num][1] != user) return false;36
// Condition-2 (Atleast one descendent should be locked)37
void checkDescendents(int num, bool &atleastOne) {38
if (descendents.count(num) == 0 || descendents[num].size() == 0) return;40
for (int &x : descendents[num]) {41
if (Node[x][1] != -1) {45
checkDescendents(x, atleastOne);49
// Condition-3 (Check if any ancestor is locked)50
bool IsAnyAncestorLocked(int &num) {51
if (num == -1) return false; // you reached end and found none locked53
return Node[num][1] != -1 || IsAnyAncestorLocked(Node[num][0]);56
void unlockDescendents(int num) {57
if (descendents.count(num) == 0 || descendents[num].size() == 0) return;59
for (int &x : descendents[num]) {65
bool upgrade(int num, int user) {67
if (Node[num][1] != -1) return false;70
bool atleastOne = false;71
checkDescendents(num, atleastOne);72
// If no node was locked, return false73
if (!atleastOne) return false;76
if (IsAnyAncestorLocked(Node[num][0])) return false;79
unlockDescendents(num);