#include "bits/stdc++.h"
#define ff first
#define ss second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const char nl = '\n';
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int N, R, Q; cin >> N >> R >> Q;
vector<vector<int>> adj(N + 1);
vector<int> reg(N + 1), qnt(R + 1);
cin >> reg[1];
qnt[reg[1]]++;
for (int i = 2; i <= N; i++) {
int a, b; cin >> a >> b;
adj[a].push_back(i);
reg[i] = b;
qnt[b]++;
}
// vertices de regioes pequenas
vector<int> large_id(R + 1);
const int C = 500;
int RR = 0;
for (int i = 1; i <= R; i++)
if (qnt[i] > C) large_id[i] = ++RR;
vector dp(N + 1, vector<int>(RR + 1));
auto dfs = [&](auto dfs, int x) -> void {
for (int k : adj[x]) {
dfs(dfs, k);
dp[x][large_id[reg[k]]]++;
for (int v = 1; v <= RR; v++)
dp[x][v] += dp[k][v];
}
}; dfs(dfs, 1);
vector ans(RR + 1, vector<int>(RR + 1));
for (int i = 1; i <= N; i++)
for (int j = 1; j <= RR; j++)
ans[large_id[reg[i]]][j] += dp[i][j];
// vertices de regioes grandes
vector<vector<int>> emp(R + 1);
vector<int> tin(N + 1), tout(N + 1);
int tcur = 0;
auto euler = [&](auto euler, int x) -> void {
tin[x] = ++tcur;
emp[reg[x]].push_back(x);
for (int k : adj[x])
euler(euler, k);
tout[x] = tcur;
}; euler(euler, 1);
auto calc = [&](int a, int b) -> int {
vector<pii> line;
for (int x : emp[a]) {
line.push_back({tin[x], 1});
line.push_back({tout[x], 3});
}
for (int y : emp[b])
line.push_back({tin[y], 2});
sort(all(line));
int ans = 0, cnt = 0;
for (auto [d, t] : line) {
if (t == 1) cnt++;
if (t == 2) ans += cnt;
if (t == 3) cnt--;
}
return ans;
};
map<pii, int> memo;
while (Q--) {
int a, b; cin >> a >> b;
if (large_id[a] && large_id[b]) {
cout << ans[large_id[a]][large_id[b]] << endl;
} else {
if (memo[{a, b}] != 0) { cout << memo[{a, b}] << endl; continue; }
int ans = calc(a, b);
memo[{a, b}] = ans;
cout << ans << endl;
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |