package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
// 建图(邻接表)
graph := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Fscan(in, &u, &v)
graph[u] = append(graph[u], v)
graph[v] = append(graph[v], u)
}
// BFS 建立有根树(以1为根),记录 children
parent := make([]int, n+1)
children := make([][]int, n+1)
visited := make([]bool, n+1)
queue := []int{1}
visited[1] = true
for len(queue) > 0 {
u := queue[0]
queue = queue[1:]
for _, v := range graph[u] {
if !visited[v] {
visited[v] = true
parent[v] = u
children[u] = append(children[u], v)
queue = append(queue, v)
}
}
}
// 读入 k 和集合 V
var k int
fmt.Fscan(in, &k)
isInV := make([]bool, n+1)
for i := 0; i < k; i++ {
var x int
fmt.Fscan(in, &x)
isInV[x] = true
}
// DFS 后序遍历,计算子树中 V 的节点数
subCnt := make([]int, n+1) // subCnt[u] = 子树 u 中属于 V 的节点数
var dfs func(int)
dfs = func(u int) {
if isInV[u] {
subCnt[u] = 1
}
for _, v := range children[u] {
dfs(v)
subCnt[u] += subCnt[v]
}
}
dfs(1)
// 计算答案:ans[u] = subCnt[u]^2 - sum(child subCnt[child]^2)
ans := make([]int, n+1)
for u := 1; u <= n; u++ {
total := subCnt[u] * subCnt[u]
for _, v := range children[u] {
total -= subCnt[v] * subCnt[v]
}
ans[u] = total
}
// 输出
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, ans[i])
}
fmt.Fprintln(out)
}