#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#define shit short int
#define ll long long
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define NEK 1000000000
#define mod 1000000007
#define mod2 1000000009
#define rsz resize
#define prv1 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define sig 0.0000001
using namespace std;
vec<vec<int>> g;
vec<vec<int>> mp;
vec<int> k;
void dfs(int x, int f, int poc = 0, int pr = -1) {
if (k[x] == f) poc++;
else {
mp.back()[k[x]] += poc;
}
trav(i, g[x]) {
if (i == pr) continue;
dfs(i, f, poc, x);
}
return;
}
vec<int> e1, e2;
int ti = 0;
void dfs2(int x, int pr = -1) {
e1[x] = ti; ti++;
trav(i, g[x]) {
if (i == pr) continue;
dfs2(i, x);
}
e2[x] = ti - 1;
return;
}
void solve() {
int n, r, q; cin >> n >> r >> q;
k.resize(n); e1.resize(n); e2.resize(n);
g.resize(n);
cin >> k[0]; k[0]--;
For(i, (n - 1)) {
int a; cin >> a >> k[i + 1]; k[i + 1]--;
a--;
g[i+1].push_back(a);
g[a].push_back(i+1);
}
vec<int> p(r, 0);
vec<int> prazdny(r, 0);
For(i, k.size()) p[k[i]]++;
int odm = sqrt(n);
vec<int> v(r, -1);
For(i, p.size()) {
if (p[i] > odm) {
v[i] = mp.size();
mp.push_back(prazdny);
dfs(0, i);
}
}
vec<vec<int>> vy(r);
dfs2(0);
For(i, n) {
vy[k[i]].push_back(e1[i]);
}
For(i, vy.size()) sort(vy[i].begin(), vy[i].end());
For(i, q) {
int r1, r2; cin >> r1 >> r2; r1--; r2--;
if (v[r1] == -1) {
int vv = 0;
trav(j, vy[r1]) {
int q1 = lower_bound(vy[r2].begin(), vy[r2].end(), e1[j]) - vy[r2].begin();
int q2 = upper_bound(vy[r2].begin(), vy[r2].end(), e2[j]) - vy[r2].begin();
vv += q2 - q1;
}
cout << vv << endl;
}
else {
cout << mp[v[r1]][r2] << endl;
}
}
return;
}
signed main() {
//ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
//cin >> t;
t = 1;
while (t--) {
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |