#include <iostream>
#include <vector>
using namespace std;
const int N = 2e5 + 5;
const int R = 25005;
const int B = 450;
vector<int> g[N], reg[R];
int r12[B][R], r21[B][R], in[N], out[N], T = 0;
void dfs(int node, int par){
in[node] = ++T;
for(int &v : g[node]){
if(v == par)continue;
dfs(v, node);
}
out[node] = T;
}
struct BIT{
vector<int>fen;
int sz;
BIT(int n){
sz = n;
fen.resize(n + 1);
}
void Update(int pos, int val){
while(pos <= sz){
fen[pos] += val;
pos += (pos & -pos);
}
}
int Sum(int pos){
int s = 0;
while(pos > 0){
s += fen[pos];
pos -= (pos & -pos);
}
return s;
}
};
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, r, q;
cin >> n >> r >> q;
for(int i = 1;i <= n;++i){
if(i != 1){
int p;
cin >> p;
g[p].push_back(i);
g[i].push_back(p);
}
int h;
cin >> h;
reg[h].push_back(i);
}
dfs(1, 1);
vector<int>S, s(n + 1, -1);
for(int i = 1;i <= r;++i){
if(reg[i].size() > B){
s[i] = S.size();
S.push_back(i);
}
}
for(int r1 = 0;r1 < (int)S.size();++r1){
vector<int>v(n + 2);
for(int j : reg[S[r1]]){
v[in[j]]++;
v[out[j] + 1]--;
}
for(int i = 1;i <= n;++i){
v[i] += v[i - 1];
}
for(int r2 = 1;r2 <= r;++r2){
for(int j : reg[r2]){
r12[r1][r2] += v[in[j]];
}
}
}
for(int r2 = 0;r2 < (int)S.size();++r2){
vector<int>v(n + 1);
for(int j : reg[S[r2]]){
v[in[j]]++;
}
for(int i = 1;i <= n;++i){
v[i] += v[i - 1];
}
for(int r1 = 1;r1 <= r;++r1){
for(int j : reg[r1]){
r21[r2][r1] += v[out[j]] - v[in[j] - 1];
}
}
}
BIT tree(n);
while(q--){
int r1, r2;
cin >> r1 >> r2;
if(s[r1] != -1){
cout << r12[s[r1]][r2] << endl;
}
else if(s[r2] != -1){
cout << r21[s[r2]][r1] << endl;
}
else{
int res = 0;
for(int j : reg[r2]){
tree.Update(in[j], 1);
}
for(int j : reg[r1]){
res += tree.Sum(out[j]) - tree.Sum(in[j] - 1);
}
for(int j : reg[r2]){
tree.Update(in[j], -1);
}
cout << res << endl;
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |