include <stdio.h>
define m 200005
int h[m], to[m*2], nxt[m*2], ec;
int color[m], sz[m], son[m], ans[m], cnt[m];
int n, n1;
void ae(int u, int v) {
to[++ec] = v;
nxt[ec] = h[u];
h[u] = ec;
}
void cay(int u, int p) {
sz[u] = 1;
son[u] = 0;
for (int i = h[u]; i; i = nxt[i]) {
int v = to[i];
if (v == p) continue;
cay(v, u);
sz[u] += sz[v];
if (sz[v] > sz[son[u]]) son[u] = v;
}
}
void update(int u, int p, int val, int skip) {
if (val == 1) {
if (cnt[color[u]] == 0) n1++;
cnt[color[u]]++;
} else {
cnt[color[u]]--;
if (cnt[color[u]] == 0) n1--;
}
for (int i = h[u]; i; i = nxt[i]) {
int v = to[i];
if (v != p && v != skip) update(v, u, val, -1);
}
}
void re(int u, int p, int keep) {
for (int i = h[u]; i; i = nxt[i]) {
int v = to[i];
if (v != p && v != son[u]) re(v, u, 0);
}
if (son[u]) re(son[u], u, 1);
update(u, p, 1, son[u]);
ans[u] = n1;
if (!keep) update(u, p, -1, -1);
}
int main() {
if (scanf("%d", &n) != 1) return 0;
for (int i = 0; i < n - 1; i++) {
int u, v;
scanf("%d %d", &u, &v);
ae(u, v);
ae(v, u);
}
for (int i = 1; i <= n; i++) {
if (scanf("%d", &color[i]) != 1) break;
}
cay(1, 0);
re(1, 0, 1);
for (int i = 1; i <= n; i++) {
printf("%d%c", ans[i], (i == n ? '\n' : ' '));
}
return 0;
}