import
java.util.*;
public
class
Main {
static
int
N =
100005
;
static
List<Integer>[] v =
new
List[N];
static
int
[] colour =
new
int
[N];
static
int
[] in_time =
new
int
[N];
static
int
[] out_time =
new
int
[N];
static
int
[] cnt =
new
int
[N];
static
int
[] freq =
new
int
[N];
static
int
[] flatTree =
new
int
[N];
static
int
n =
0
;
static
int
sq =
0
;
static
int
start =
0
;
static
void
DFSEuler(
int
a,
int
par)
{
start++;
in_time[a] = start;
flatTree[start] = colour[a];
for
(
int
i : v[a]) {
if
(i == par) {
continue
;
}
DFSEuler(i, a);
}
out_time[a] = start;
}
static
int
comparator(Pair<Integer, Integer> a,
Pair<Integer, Integer> b)
{
if
(in_time[a.getKey()] / sq != in_time[b.getKey()] / sq) {
return
in_time[a.getKey()] - in_time[b.getKey()];
}
return
out_time[a.getKey()] - out_time[b.getKey()];
}
static
void
solve(List<Pair<Integer, Integer> > arr,
int
q)
{
sq = (
int
)Math.sqrt(n) +
1
;
int
[] answer =
new
int
[q];
Map<Pair<Integer, Integer>, Integer> idx =
new
HashMap<>();
for
(
int
i =
0
; i < q; i++) {
idx.put(arr.get(i), i);
}
DFSEuler(
1
,
0
);
arr.sort(
new
Comparator<Pair<Integer, Integer> >() {
@Override
public
int
compare(Pair<Integer, Integer> a,
Pair<Integer, Integer> b)
{
if
(in[a.getFirst()] / sq
!= in[b.getFirst()] / sq)
return
in[a.getFirst()]
- in[b.getFirst()];
return
out[a.getFirst()]
- out[b.getFirst()];
}
});
int
l =
1
, r =
0
;
for
(
int
i =
0
; i < q; i++) {
int
node = arr.get(i).getFirst(),
x = arr.get(i).getSecond(),
id = idx.get(arr.get(i));
while
(l > in[node]) {
l--;
cnt[flatTree[l]]++;
freq[cnt[flatTree[l]]]++;
}
while
(r < out[node]) {
r++;
cnt[flatTree[r]]++;
freq[cnt[flatTree[r]]]++;
}
while
(l < in[node]) {
freq[cnt[flatTree[l]]]--;
cnt[flatTree[l]]--;
l++;
}
while
(r > out[node]) {
freq[cnt[flatTree[r]]]--;
cnt[flatTree[r]]--;
r--;
}
answer[id] = freq[x];
}
for
(
int
i =
0
; i < q; i++)
System.out.print(answer[i] +
" "
);
}
public
static
void
main(String[] args)
{
Scanner sc =
new
Scanner(System.in);
n =
8
;
for
(
int
i =
1
; i <= n; i++) {
v[i] =
new
ArrayList<Integer>();
}
v[
1
].add(
2
);
v[
2
].add(
1
);
v[
2
].add(
3
);
v[
3
].add(
2
);
v[
2
].add(
4
);
v[
4
].add(
2
);
v[
1
].add(
5
);
v[
5
].add(
1
);
v[
5
].add(
6
);
v[
6
].add(
5
);
v[
5
].add(
7
);
v[
7
].add(
5
);
v[
5
].add(
8
);
v[
8
].add(
5
);
colour[
1
] =
1
;
colour[
2
] =
2
;
colour[
3
] =
2
;
colour[
4
] =
3
;
colour[
5
] =
3
;
colour[
6
] =
2
;
colour[
7
] =
3
;
colour[
8
] =
3
;
List<Pair<Integer, Integer> > queries
= Arrays.asList(
new
Pair<Integer, Integer>(
1
,
2
),
new
Pair<Integer, Integer>(
1
,
3
),
new
Pair<Integer, Integer>(
1
,
4
),
new
Pair<Integer, Integer>(
2
,
3
),
new
Pair<Integer, Integer>(
5
,
3
));
int
q = queries.size();
solve(queries, q);
}
}