char buf[65536], *p1, *p2; inlineintread(){ int x = 0; char ch; while ((ch = gc) < 48); do x = x * 10 + ch - 48; while ((ch = gc) >= 48); return x; } int cnt[25005], colcnt[25005], col[200005], id[200005], pre[200005]; int ans[200005], q1tot, q2tot; std::vector<int> sons[200005], qst[200005], qst2[200005]; structQuest { int r1, r2, id; } q1[200005], q2[200005]; std::map<int, int> mp[25005];
voiddfs1(int u){ ++ colcnt[col[u]]; for (reg int v : sons[u]) dfs1(v); } voiddfs2(int u){//方法二 for (reg int i : qst[col[u]]) ans[q1[i].id] += cnt[q1[i].r1]; ++ cnt[col[u]]; for (reg int v : sons[u]) dfs2(v); -- cnt[col[u]]; } voiddfs3(int u){//方法一 for (reg int i : qst2[col[u]]) ans[q2[i].id] -= cnt[q2[i].r2]; for (reg int v : sons[u]) dfs3(v); for (reg int i : qst2[col[u]]) ans[q2[i].id] += cnt[q2[i].r2]; ++ cnt[col[u]]; }
intmain(){ int n, m, S; n = read(), read(), m = read(), col[1] = read(); S = sqrt(n); for (int i = 2; i <= n; ++ i) { int fa = read(), c = read(); col[i] = c, sons[fa].push_back(i); } dfs1(1); for (int i = 1; i <= m; ++ i) { pre[i] = i; int r1 = read(), r2 = read(); if (!mp[r1].count(r2)) mp[r1][r2] = i; else {pre[i] = mp[r1][r2]; continue;} if (colcnt[r2] <= S) { q1[++ q1tot].r1 = r1, q1[q1tot].r2 = r2, q1[q1tot].id = i; qst[r2].push_back(q1tot); } else { q2[++ q2tot].r1 = r1, q2[q2tot].r2 = r2, q2[q2tot].id = i; qst2[r1].push_back(q2tot); } } dfs2(1); dfs3(1); for (int i = 1; i <= m; ++ i) printf("%d\n", ans[pre[i]]); return0; }