Submission #913909

#TimeUsernameProblemLanguageResultExecution timeMemory
913909VMaksimoski008Regions (IOI09_regions)C++14
0 / 100
1416 ms131072 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int maxn = 2e5 + 5;

void setIO() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}

int n, r, q, dp[501][maxn], i, timer = 0, in[maxn], out[maxn], r1, r2, ans;
short home[maxn];
vector<vector<int> > graph;

void dfs(int u) {
    dp[home[u]][u]++;

    for(int &v : graph[u]) {
        dfs(v);
        for(i=1; i<=r; i++)
            dp[i][u] += dp[i][v];
    }
}

void dfs2(int u) {
    in[u] = timer++;

    for(int &v : graph[u])
        dfs2(v);

    out[u] = timer;
}

bool anc(int u, int v) { return (in[u] <= in[v] && out[u] >= out[v]); }

int32_t main() {
    setIO();

    cin >> n >> r >> q;
    graph.resize(n+1);
    vector<int> cnt(r+1);

    cin >> home[1];
    cnt[home[1]]++;

    for(i=2; i<=n; i++) {
        int p;
        cin >> p >> home[i];
        cnt[home[i]]++;
        graph[p].push_back(i);
    }

    if(r <= 500) {
        dfs(1);

        vector<vector<int> > by_home(r+1);
        for(i=1; i<=n; i++)
            by_home[home[i]].push_back(i);

        while(q--) {
            cin >> r1 >> r2;

            for(int &x : by_home[r1])
                ans += dp[r2][x];
        
            cout << ans << '\n';
            cout.flush();
        }
        return 0;
    }

    int mx = 0;
    for(i=1; i<=n; i++) mx = max(mx, cnt[i]);

    if(mx <= 500) {
        dfs2(1);
        vector<vector<int> > by_home(r+1);
        for(i=1; i<=n; i++)
            by_home[home[i]].push_back(i);

        while(q--) {
            cin >> r1 >> r2;
            ans = 0;

            for(int &u : by_home[r1])
                for(int &v : by_home[r2])
                    ans += anc(u, v);

            cout << ans << '\n';
            cout.flush();
        }

        return 0;
    }

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