#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2e5 + 50;
vector<int> G[N], re[N];
int t = 0, tin1[N], tout1[N], tour2[2 * N], tin2[N], tout2[N], c[N], n, r, q, b;
vector<array<int, 2>> que1[N];
struct Fenwick {
int n;
vector<long long> tree;
Fenwick(int size) : n(size), tree(size + 1) {}
void update(int idx, long long delta) {
for (; idx <= n; idx += idx & -idx)
tree[idx] += delta;
}
long long query(int idx) {
long long res = 0;
for (; idx > 0; idx -= idx & -idx)
res += tree[idx];
return res;
}
long long query(int l, int r) {
return query(r) - query(l - 1);
}
};
void dfs2(int s, int p) {
tin2[s] = t;
tour2[t++] = s;
for (auto u : G[s]) {
if (u == p) continue;
dfs2(u, s);
}
tout2[s] = t;
tour2[t++] = s;
}
void dfs1(int s, int p) {
tin1[s] = t++;
for (auto u : G[s]) {
if (u == p) continue;
dfs1(u, s);
}
tout1[s] = t;
}
int main()
{
// ifstream cin("input.txt");
// ofstream cout("output.txt");
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> r >> q;
b = sqrt(n);
for (int i = 0; i < n; i++) {
int u, v, w;
if (i == 0) {
cin >> w;
c[i] = w;
re[w].push_back(u);
} else {
u = i + 1;
cin >> v >> w;
u--; v--;
G[u].push_back(v);
G[v].push_back(u);
c[u] = w;
re[w].push_back(u);
}
}
t = 0;
dfs1(0, 0);
t = 0;
dfs2(0, 0);
vector<ll> ans(q);
for (int i = 0; i < q; i++) {
int a, b; cin >> a >> b;
que1[b].push_back({a, i});
}
vector<int> cnt(r + 1, 0);
vector<int> huge;
for (int i = 0; i < 2 * n; i++) {
int cur = tour2[i];
if (i == tin2[cur]) {
if (que1[c[cur]].size() <= b) {
for (auto u : que1[c[cur]]) {
ans[u[1]] += cnt[u[0]];
}
}
cnt[c[cur]]++;
} else {
cnt[c[cur]]--;
}
}
for (int r1 = 1; r1 <= r; r1++) {
if (que1[r1].size() <= b) continue;
Fenwick tree(n);
for (auto u : re[r1]) {
tree.update(tin1[u] + 1, 1);
}
for (auto r2 : que1[r1]) {
for (auto u : re[r2[0]]) {
ans[r2[1]] += tree.query(tin1[u] + 1, tout1[u]);
}
}
}
for (auto u : ans) cout << u << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |