Submission #1258957

#TimeUsernameProblemLanguageResultExecution timeMemory
1258957nguyenkhangninh99Regions (IOI09_regions)C++20
100 / 100
3020 ms52152 KiB

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 2e5 + 5;

int tin[maxn], out[maxn], timeDfs;
vector<int> g[maxn], p[maxn], c[maxn];
vector<vector<int>> cost;
int r[maxn], id[maxn];

void dfs(int u, int par){
    tin[u] = ++timeDfs;
    for(int v: g[u]) dfs(v, u);
    out[u] = timeDfs;
}

void dfsc(int col, int u, int cnt){
    if(r[u] == col) cnt++;
    else cost[id[col]][r[u]] += cnt;
    for(int v: g[u]) dfsc(col, v, cnt);
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, rmax, q; cin >> n >> rmax >> q;

    for(int i = 1; i <= n; i++){
        if(i >= 2){
            int x; cin >> x;
            g[x].push_back(i);  
        }
        cin >> r[i];
    }

    dfs(1, -1);

    for(int i = 1; i <= n; i++){
        p[r[i]].push_back(tin[i]);
        c[r[i]].push_back(i);
    }

    int cur = -1, BLOCK = sqrt(n);
    for(int i = 1; i <= rmax; i++){
        if(p[i].size() >= BLOCK){
            id[i] = ++cur;
            cost.push_back(vector<int>(rmax+1));
            dfsc(i, 1, 0);
        }
        sort(p[i].begin(), p[i].end());
    }

    for(int i = 1; i <= q; i++){
        int r1, r2; cin >> r1 >> r2;
        if(p[r1].size() >= BLOCK) cout << cost[id[r1]][r2] << endl;
        else{
            int ans = 0;
            for(int u: c[r1]){
                int l = lower_bound(p[r2].begin(), p[r2].end(), tin[u]) - p[r2].begin();
                int r = upper_bound(p[r2].begin(), p[r2].end(), out[u]) - p[r2].begin() - 1;
                ans += r - l + 1;
            }
            cout << ans << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...