#include <iostream>
using namespace std;

const int MAXN = 2e5;

int N;
int c[MAXN];
int tot = 0;
int head[MAXN], Next[MAXN], to[MAXN], edge[MAXN];

int vis[MAXN];
int child[MAXN];	// child[i]: 以顶点i为根的子树的顶点数
void dfs1(int v, int fa) {
	if(vis[v]) return;
	vis[v] = 1;
	int cnt = 0;
	for(int i=head[v]; i; i=Next[i]) {
		int u = to[i];
		if(!vis[u]) {
			dfs1(u, v);
			++child[v];
			cnt += child[u];
		}
	}
	child[v] += cnt;
}

inline int cal() {
	
}
int sub[MAXN], int cnt[MAXN], ans[MAXN];
int dfs(int v, int fa) {
	int tmp = cnt[c[v]];
	sub[v] = 1;
	for(int i=head[v]; i; i=Next[i]) {
		int u = to[i];
		if(u == fa) continue;
		sub[v] += dfs(u, v);
		ans[c[v]] = 
			
	}
	
	cnt[c[v]] = tmp + sub[v];
	return sub[v];
}

void add(int a, int b, int c) {
	++tot;
	Next[tot] = head[a];
	to[tot] = b;
	edge[tot] = c;
	head[a] = tot;
}
int main() {
	cin>>N;
	for(int i=1; i<=N; i++) {
		cin >> c[i];
	}
	int a, b;
	for(int i=1; i<N; i++) {
		cin>>a>>b;
		add(a, b, 1);
		add(b, a, 1);
	}
	
	//dfs1(1, 0);
	dfs(1, 0);
	
	for(int i=1; i<=N; i++) {
		cout << sub[i] << endl;
	}
	return 0;
}