Submission #627339

#TimeUsernameProblemLanguageResultExecution timeMemory
627339clamsRegions (IOI09_regions)C++17
55 / 100
8095 ms34632 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
const int R = 25e3 + 5;
const int Q = 2e5 + 5;
const int R1 = 505;

int n, r, q;
int home[N], par[N];
vector<int> adj[N];
vector<int> reg[R];

namespace sub1 {
    map<int, int> mp[N];
    int pre[R1][R1];

    void dfs(int u, int p) {
        for (int v : adj[u]) {
            if (v == p) continue;

            dfs(v, u);

            if (mp[u].size() < mp[v].size()) swap(mp[u], mp[v]);
            for (auto i : mp[v]) mp[u][i.first] += i.second;
        }
        for (auto i : mp[u]) {
            pre[home[u]][i.first] += i.second;
        }
        mp[u][home[u]]++;
    }

    void solve() {
        dfs(1, 0);

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

            cout << pre[r1][r2] << endl;
        }
    }
}

namespace sub2 {

int tin[N], tout[N], timer = 0;

    void dfs(int u, int p) {
        tin[u] = ++timer;
        for (int v : adj[u]) {
            if (v == p) continue;
            dfs(v, u);
        }
        tout[u] = timer;
    }

    bool ischild(int i, int j) {
        return tin[i] <= tin[j] && tout[j] <= tout[i];
    }

    void solve() {
        dfs(1, 0);

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

            int ans = 0;
            for (int i : reg[r1]) {
                for (int j : reg[r2]) {
                    ans += (i != j && ischild(i, j));
                }
            }

            cout << ans << endl;
        }
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> r >> q;

    cin >> home[1];
    reg[home[1]].push_back(1);
    for (int i = 2; i <= n; i++) {
        cin >> par[i] >> home[i];
        adj[par[i]].push_back(i);
        adj[i].push_back(par[i]);
        reg[home[i]].push_back(i);
    }

    if (r < R1) {
        sub1::solve();
    } else {
        sub2::solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...