#include<stdio.h>
#include<string.h>
#define N 300005
#define M 25
typedef struct edge{
int to, next;
}edge;
edge e[N<<1];
int n, way[N], head[N], tot, val[N], p[N][M], depth[N], lg[N], w[N];
void add(int u, int v){
e[++tot].next = head[u]; e[tot].to = v;
head[u] = tot;
e[++tot].next = head[v]; e[tot].to = u;
head[v] = tot;
}
void dfs(int u, int fa){
depth[u] = depth[fa] + 1; p[u][0] = fa;
for(int i = 1; i <= lg[depth[u]]; i++)
p[u][i] = p[p[u][i - 1]][i - 1];
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs(v, u);
}
}
void search(int fa, int u){
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(fa == v) continue;
search(u, v);
w[u] += w[v];
}
}
void swap(int*a, int*b){int t = *a; *a = *b; *b = t;}
int lca(int u, int v){
if(depth[u] < depth[v]) swap(&u, &v);
int d = depth[u] - depth[v], i = 0;
while(d){
if(d&1) u = p[u][i];
i++; d >>= 1;
}
if(u == v) return u;
for(i = lg[depth[u]]; ~i; --i){
if(p[u][i] != p[v][i]){
u = p[u][i]; v = p[v][i];
}
}
return p[u][0];
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &way[i]);
int u, v;
for(int i = 1; i < n; i++){
scanf("%d%d", &u, &v);
add(u, v);
}
for(int i = 1; i <= n; i++)
lg[i] = lg[i - 1] + (1<<lg[i - 1] == i);
dfs(1, 0);
int t, f;
for(int i = 1; i < n; i++){
u = way[i]; v = way[i + 1]; t = lca(u, v);
f = p[t][0];
val[u]++; val[v]++; val[t]--; val[f]--;
}
memcpy(w, val, sizeof(int) * n + 1);
search(0, 1);
for(int i = 1; i <= n; i++)
printf("%d\n",(i == way[1])? w[i] : w[i] - 1);
return 0;
}