Submission #501140

#TimeUsernameProblemLanguageResultExecution timeMemory
501140JooRegions (IOI09_regions)C++17
30 / 100
1155 ms59344 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+10, MR = 510;

int n, R, Q, sz[N], cnt[MR], re[N], ans[MR][MR];
vector<int> G[N], ch[N];

void dfs1(int u, int p){
    sz[u] = 1;
    for(int v : G[u]){
        dfs1(v, u);
        sz[u] += sz[v];
    }
}

void dfs2(int u, int p, bool keep){
    int bc = -1;
    for(int v : G[u]) if(bc == -1 or sz[v] > sz[bc]) bc = v;

    for(int v : G[u]) if(v != bc) dfs2(v, u, 0);
    if(bc != -1){
        dfs2(bc, u, 1);
        swap(ch[u], ch[bc]);
    }
    ch[u].emplace_back(u);
    cnt[re[u]]++;

    for(int v : G[u]){
        if(v == bc) continue;
        for(int vv : ch[v]){
            cnt[re[vv]]++;
            ch[u].emplace_back(vv);
        }
    }
    for(int i = 1; i <= R; i++) ans[re[u]][i] += cnt[i];

    if(keep == 0){
        for(int v : ch[u]) cnt[re[v]]--;
    }
}

int getans(int r1, int r2){
    return ans[r1][r2];
}

int main(void){
    cin >> n >> R >> Q;
    cin >> re[1];
    for(int i = 2; i <= n; i++){
        int p; cin >> p >> re[i];
        G[p].emplace_back(i);
    }

    dfs1(1, -1);
    dfs2(1, -1, 1);

    while(Q--){
        int r1, r2; cin >> r1 >> r2;
        cout << getans(r1, r2) << endl;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...