Submission #364641

#TimeUsernameProblemLanguageResultExecution timeMemory
364641TruaShamuRegions (IOI09_regions)C++11
95 / 100
8067 ms55852 KiB
#include <bits/stdc++.h>

#define ll long long
#define pb push_back
#define F first
#define S second

using namespace std;

const int N = 200005, K = 25001;
const int INF = 1e9;
const int B = 250;
const int P = N / B + 5;

int n, r, q, p[N], a[N];
int prec[P][K];
vector <int> g[N], has[K];

int id[K], cnt[K];
void dfs(int v, int cnt, int start) {
    cnt += start == a[v];
    if (a[v] != start) prec[id[start]][a[v]] += cnt;
    for (int i : g[v]) {
        dfs(i, cnt, start);
    }
}

int in[N], out[N], T = 0;
vector <int> ins[K];
void dfs(int v) {
    in[v] = ++T;
    ins[a[v]].pb(in[v]);
    for (int i : g[v]) {
        dfs(i);
    }
    out[v] = T;
}

int main() {
    ios_base :: sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> r >> q;
    for (int i = 1; i <= n; i++) {
        if (i == 1) cin >> a[i];
        else cin >> p[i] >> a[i];
    }
    for (int i = 2; i <= n; i++) {
        g[p[i]].pb(i);
    }
    for (int i = 1; i <= n; i++) {
        cnt[a[i]]++, has[a[i]].pb(i);
    }
    int cur = 0;
    for (int i = 1; i <= r; i++) {
        if (cnt[i] > B) {
            id[i] = ++cur;
            dfs(1, 0, i);
        }
    }
    dfs(1);
    while(q--) {
        int p, q; cin >> p >> q;
        if (cnt[p] > B) {
            cout << prec[id[p]][q] << endl;
            continue;
        }
        int res = 0;
        for (int i : has[p]) {
            res += upper_bound(ins[q].begin(), ins[q].end(), out[i]) -
                   lower_bound(ins[q].begin(), ins[q].end(), in[i]);
        }
        cout << res << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...