#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,col[maxn];
vector<int>g[maxn];
int cnt[maxn];
int sz[maxn],hs[maxn];
int isbig[maxn];
long long tot,ans[maxn];int mx;
void maintain(int x)
{
if(cnt[x]>mx){mx=cnt[x];tot=x;}
else if(cnt[x]==mx)tot+=x;
}
void prepare(int x,int f)
{
sz[x]=1;
for(auto to:g[x])
{
if(to==f)continue;prepare(to,x);
sz[x]+=sz[to];if(sz[hs[x]]<sz[to])hs[x]=to;
}
}
void add(int x,int f,int ad)
{
cnt[col[x]]+=ad;maintain(col[x]);
for(auto to:g[x])
{
if(to==f||isbig[to])continue;
add(to,x,ad);
}
}
void dfs(int x,int f,int keep)
{
for(auto to:g[x])
{
if(to==f||hs[x]==to)continue;
dfs(to,x,0);//处理轻儿子 (不保留)
}
if(hs[x])dfs(hs[x],x,1);//处理重儿子 (保留)
isbig[hs[x]]=1;//重儿子已经算过了 打上标记 后面加轻儿子时不处理了
add(x,f,1);//暴力添加轻儿子
isbig[hs[x]]=0;//删除时全删
ans[x]=tot;
if(!keep){add(x,f,-1);tot=mx=0;} //不保留就全删
}
void solve()
{
prepare(1,1);
dfs(1,1,1);
}
int main()
{
scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&col[i]);
for(int i=1;i<n;i++)
{
int x,y;scanf("%d%d",&x,&y);
g[x].push_back(y);g[y].push_back(x);
}
solve();
for(int i=1;i<=n;i++)printf("%I64d ",ans[i]);
return 0;
}