#include "beechtree.h"
#include <bits/stdc++.h>
using namespace std;
void dfs(int u, vector<vector<int>> &child, vector<int> &tin) {
    static int cte = 0;
    tin[u] = cte++;
    for (int v : child[u]) dfs(v, child, tin);
}
vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
    vector<int> ret(N);
    vector<vector<int>> child(N);
    for (int i = 1; i < N; i++) child[P[i]].push_back(i);
    vector<int> tin(N);
    dfs(0, child, tin);
    for (int i = 0; i < N; i++) {
        if (child[i].empty()) {
            ret[i] = true;
            continue;
        }
        map<int, vector<int>> P_C;
        stack<int> dt;
        dt.push(i);
        while (!dt.empty()) {
            int u = dt.top();
            dt.pop();
            
            if (u != i) P_C[P[u]].push_back(C[u]);
            for (int v : child[u]) dt.push(v);
        }
        bool can = true;
        vector<tuple<int, int, int, vector<int>>> sz_PC;
        for (auto [p, c] : P_C) {
            sort(c.begin(), c.end());
            for (int j = 0; j < (int)c.size()-1; j++) {
                if (c[j] == c[j+1]) can = false;
            }
            sz_PC.emplace_back(c.size(), -tin[p], p, c);
        }
        if (!can) {
            ret[i] = can;
            continue;
        }
        sort(sz_PC.begin(), sz_PC.end());
        reverse(sz_PC.begin(), sz_PC.end());
        
        int tmp_idx = 0;
        while (get<2>(sz_PC[tmp_idx]) != i) tmp_idx++;
        swap(sz_PC[0], sz_PC[tmp_idx]);
        map<int, int> cnt;
        int cur = 0;
        vector<int> seq;
        for (auto [sz, tt, p, c] : sz_PC) {
            for (int j : c) {
                if (cnt[j] < cur) can = false;
                cnt[j]++;
            }
            cur++;
            seq.push_back(p);
        }
        map<int, int> cnt2;
        for (int u : seq) {
            if (u == i) continue;
            can &= (seq[cnt2[C[u]]] == P[u]);
            cnt2[C[u]]++;
        }
        ret[i] = can;
    }
    return ret;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |