Submission #1042853

#TimeUsernameProblemLanguageResultExecution timeMemory
1042853ThommyDBRegions (IOI09_regions)C++17
100 / 100
3110 ms25764 KiB
#include<bits/stdc++.h>

using namespace std;

int n, r, q;
vector<int> home, rid;
vector<vector<int>> reverse_super, conn, tot;
vector<pair<pair<int, int>, int>> euler;

int timer = 0;

void euler_tour(int at) {
	euler[at].first.first = timer;
    euler[timer].second = at;
    conn[home[at]].push_back(timer);
    timer++;
	for (int u : reverse_super[at]) {
		euler_tour(u);
	}
	euler[at].first.second = timer;
}

void dfs(int x, int parreg, int parc){
    if(home[x]==parreg){
        parc++;
    }
    tot[rid[parreg]][home[x]]+=parc;
    for(auto u : reverse_super[x]) dfs(u, parreg, parc);
}

signed main(){
    cin >> n >> r >> q;
    home.resize(n+1);
    reverse_super.resize(n+1);
    euler.resize(n+1);
    conn.resize(r+1);
    rid.resize(r+1);
    cin >> home[0]; home[0]--;
    for(int i = 1; i < n; i++){
        int super;
        cin >> super >> home[i];super--; home[i]--;
        reverse_super[super].push_back(i);
    }
    euler_tour(0);

    int a=0;
    for(int i=0;i<r;i++){
        if(conn[i].size()>1000){
            rid[i]=a;
            a++;
            tot.push_back(vector<int>(r));
            dfs(0, i, 0);
        }
    }

    int r1, r2;
    for(int i = 0; i < q; i++){
        cin >> r1 >> r2;r1--;r2--;
        if(conn[r1].size()>1000){
            cout << tot[rid[r1]][r2] << "\n";
            continue;
        }
        int ans = 0;
        for(auto u : conn[r1]){
            ans +=lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.second)
            -lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.first);
        }
        cout << ans << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...