#include <bits/stdc++.h>
using
namespace
std;
void
eulerTour(vector<vector<
int
> >& tree,
vector<
int
>& vst,
int
root,
vector<
int
>& tour)
{
tour.push_back(root);
vst[root] = 1;
for
(
auto
& x : tree[root]) {
if
(!vst[x]) {
eulerTour(tree, vst, x, tour);
}
}
tour.push_back(root);
}
void
createStartEnd(vector<
int
>& tour,
vector<
int
>& start,
vector<
int
>& end)
{
for
(
int
i = 1; i < tour.size(); ++i) {
if
(start[tour[i]] == -1) {
start[tour[i]] = i;
}
else
{
end[tour[i]] = i;
}
}
}
vector<pair<
int
,
int
> >
createSortedTour(vector<
int
>& tour)
{
vector<pair<
int
,
int
> > arr;
for
(
int
i = 1; i < tour.size(); ++i) {
arr.push_back(make_pair(tour[i], i));
}
sort(arr.begin(), arr.end());
return
arr;
}
void
increment(vector<
int
>& bit,
int
pos)
{
for
(; pos < bit.size(); pos += pos & -pos) {
bit[pos]++;
}
}
int
query(vector<
int
>& bit,
int
start,
int
end)
{
--start;
int
s1 = 0, s2 = 0;
for
(; start > 0; start -= start & -start) {
s1 += bit[start];
}
for
(; end > 0; end -= end & -end) {
s2 += bit[end];
}
return
s2 - s1;
}
map<pair<
int
,
int
>,
int
> cal(
int
N,
int
Q,
vector<vector<
int
>> tree,
vector<pair<
int
,
int
>> queries)
{
vector<
int
> tour, vst(N + 1, 0),
start(N + 1, -1),
end(N + 1, -1),
bit(2 * N + 4, 0);
tour.push_back(-1);
eulerTour(tree, vst, 1, tour);
createStartEnd(tour, start, end);
auto
sortedTour = createSortedTour(tour);
auto
sortedQuery = queries;
sort(sortedQuery.begin(), sortedQuery.end());
map<pair<
int
,
int
>,
int
> queryAns;
int
tourptr = 0, queryptr = 0;
while
(queryptr < sortedQuery.size()) {
while
(queryptr < sortedQuery.size()
&& sortedQuery[queryptr].first
<= sortedTour[tourptr].first){
auto
node = sortedQuery[queryptr].second;
queryAns[sortedQuery[queryptr]]
= query(bit, start[node], end[node]) / 2;
++queryptr;
}
if
(tourptr < sortedTour.size()) {
increment(bit, sortedTour[tourptr].second);
++tourptr;
}
}
return
queryAns;
}
int
main()
{
int
N = 7, Q = 3;
vector<vector<
int
> > tree = { {},
{ 4, 6 },
{ 4 },
{ 4 },
{ 1, 2, 3, 5 },
{ 4 },
{ 1, 7 },
{ 6 } };
vector<pair<
int
,
int
> > queries
= { make_pair(4, 1),
make_pair(7, 6),
make_pair(5, 1) };
map<pair<
int
,
int
>,
int
> queryAns =
cal(N, Q, tree, queries);
for
(
auto
& x : queries) {
cout << queryAns[x] <<
'\n'
;
}
return
0;
}