#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int M=2*N;
int h[N],e[M],ne[M],idx;
int color[N];
int sz[N];
int son[N];
int cnt[N];
int mx;
ll sum,ans[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int fa){
sz[u]=1;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(j==fa) continue;
sz[u]+=dfs(j,u);;
if(sz[j]>sz[son[u]]) son[u]=j;
}
return sz[u];
}
void update(int u,int fa,int sign,int pson){
int c=color[u];
cnt[c]+=sign;
if(cnt[c]>mx) mx=cnt[c],sum=c;
else if(cnt[c]==mx) sum+=c;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(j==fa||j==pson) continue;
update(j,u,sign,pson);
}
}
void dfs1(int u,int fa,int op){
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(j==fa||j==son[u]) continue;
dfs1(j,u,0);
}
if(son[u]) dfs1(son[u],u,1);
update(u,fa,1,son[u]);
ans[u]=sum;
if(!op){
update(u,fa,-1,0);
sum=mx=0;
}
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&color[i]);
memset(h,-1,sizeof h);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,-1);
dfs1(1,-1,1);
for(int i=1;i<=n;i++){
if(i==n) printf("%lld\n",ans[i]);
else printf("%lld ",ans[i]);
}
return 0;
}