#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int n,m;
ll cnt[MAXN];
ll siz[MAXN];
int son[MAXN];
vector <int> Map[MAXN];
int col[MAXN];
ll sum[MAXN];
int ans[MAXN];
void init(int x)
{
	siz[x]=1;
	son[x]=-1;
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
	{
		int u=*it;
		init(u);
		siz[x]+=siz[u];
		if(son[x]==-1||siz[son[x]]<siz[u]) son[x]=u;
	}
}
void dfs(int x,int v,int rt)
{
	cnt[col[x]]+=v;
	if(v==1)
		if(cnt[col[x]]>cnt[ans[rt]]) ans[rt]=col[x];
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		dfs(*it,v,rt);
}
void DFS(int x,int op)
{
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		if(*it!=son[x]) DFS(*it,1);
	if(son[x]!=-1) DFS(son[x],0);
	
	if(son[x]!=-1) ans[x]=ans[son[x]];
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		if(*it!=son[x]) dfs(*it,1,x);
	cnt[col[x]]++;
	if(cnt[col[x]]>cnt[ans[x]]) ans[x]=col[x];
	for(int i=1;i<=n;i++)
		if(cnt[i]==cnt[ans[x]])
			sum[x]+=i;
	
	
	if(op==1)
	{
		cnt[col[x]]--;
		for(vector <int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
			dfs(*it,-1,x);
	}
}
int main()
{
	scanf("%d",&n); 
	for(int i=1;i<=n;i++)
		scanf("%d",&col[i]);
	for(int i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Map[x].push_back(y);
	}
	init(1);
	DFS(1,0);
	for(int i=1;i<=n;i++)
		printf("%lld ",sum[i]);
	return 0;
}
WA……