from
typing
import
List
,
Dict
,
Tuple
def
add(u:
int
, v:
int
, adj:
List
[
List
[
int
]])
-
>
None
:
adj[u].append(v)
adj[v].append(u)
def
dfs_size(v:
int
, p:
int
, adj:
List
[
List
[
int
]], size:
List
[
int
])
-
>
None
:
size[v]
=
1
for
u
in
adj[v]:
if
u !
=
p:
dfs_size(u, v, adj, size)
size[v]
+
=
size[u]
def
dfs(v:
int
, p:
int
, adj:
List
[
List
[
int
]], num:
List
[
int
],
map
:
List
[
Dict
[
int
,
int
]], qv:
List
[
List
[
int
]], ans:
Dict
[
Tuple
[
int
,
int
],
bool
], size:
List
[
int
])
-
>
None
:
mx
=
-
1
big_u
=
-
1
for
u
in
adj[v]:
if
u !
=
p:
dfs(u, v, adj, num,
map
, qv, ans, size)
if
size[u] > mx:
mx
=
size[u]
big_u
=
u
if
big_u !
=
-
1
:
map
[v]
=
map
[big_u]
else
:
map
[v]
=
{}
map
[v][num[v]]
=
map
[v].get(num[v],
0
)
+
1
for
u
in
adj[v]:
if
u !
=
big_u
and
u !
=
p:
for
key, value
in
map
[u].items():
map
[v][key]
=
value
+
map
[v].get(key,
0
)
for
freq
in
qv[v]:
ans[(v, freq)]
=
freq
in
map
[v].values()
def
solve_query(queries:
List
[
Tuple
[
int
,
int
]], N:
int
, q:
int
, adj:
List
[
List
[
int
]], num:
List
[
int
])
-
>
List
[
bool
]:
qv
=
[[]
for
i
in
range
(N
+
1
)]
for
p
in
queries:
qv[p[
0
]].append(p[
1
])
size
=
[
0
]
*
(N
+
1
)
dfs_size(
1
,
0
, adj, size)
map
=
[
None
]
*
(N
+
1
)
ans
=
{}
dfs(
1
,
0
, adj, num,
map
, qv, ans, size)
return
[ans[p]
for
p
in
queries]
if
__name__
=
=
'__main__'
:
N
=
8
adj
=
[[]
for
i
in
range
(N
+
1
)]
add(
1
,
2
, adj)
add(
1
,
3
, adj)
add(
2
,
4
, adj)
add(
2
,
5
, adj)
add(
5
,
8
, adj)
add(
5
,
6
, adj)
add(
6
,
7
, adj)
num
=
[
-
1
,
11
,
2
,
7
,
1
,
-
3
,
-
1
,
-
1
,
-
3
]
q
=
3
queries
=
[(
2
,
3
), (
5
,
2
), (
7
,
1
)]
ans
=
solve_query(queries, N, q, adj, num)
for
val
in
ans:
print
(val)