Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by NguyenVietNamSon ( 5 years ago )
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
  
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

ordered_set S[100005]; 
vector <int> adj[100005]; 
vector <int> ans; 

void dfs(int u, int father) {
    for (int i = 0; i < (int) adj[u].size(); i++) {
        int v = adj[u][i];
        if (v == father) {
            continue; 
        }
        dfs(v, u);
        if ((int) S[u].size() < (int) S[v].size()) {
            S[u].swap(S[v]);
        }
        for (ordered_set :: iterator it = S[v].begin(); it != S[v].end(); it++) {
            S[u].insert(*it);
        }
        S[v].clear(); 
    }
    if (*S[u].begin() != 1) {
        ans[u] = 1;
        return; 
    }
    ordered_set :: iterator it = S[u].end();
    it--; 
    if (*it == (int) S[u].size()) {
        ans[u] = *it + 1;
        return; 
    }
    int lo = 1; 
    int hi = (int) S[u].size() + 1;
    int res = -1; 
    while (lo <= hi) {
        int mid = (lo + hi) >> 1;
        ordered_set :: iterator it = S[u].lower_bound(mid);
        int value = *it; 
        if (S[u].order_of_key(value) + 1 == value) {
            lo = mid + 1; 
        }
        else {
            res = mid;
            hi = mid - 1; 
        }
    }
    ans[u] = res;
}

class Solution {
public:
    vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {
        int n = (int) nums.size();
        ans.clear();
        ans.resize(n);
        for (int i = 0; i < n; i++) {
            adj[i].clear();
            S[i].clear();
        }
        for (int i = 1; i < n; i++) {
            adj[i].push_back(parents[i]);
            adj[parents[i]].push_back(i);
        }
        for (int i = 0; i < n; i++) {
            S[i].insert(nums[i]); 
        }
        dfs(0, -1);
        return ans;
    }
};

 

Revise this Paste

Your Name: Code Language: