#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+10;
struct dd{
int ys;
int ans;
int aans;
int size;
vector <int> lj;
int spson;
};
dd tr[maxn]={};
int cx[maxn];
void bfs(int x,int fa)
{
tr[x].size=1;tr[x].spson=-1;
for(vector<int>::iterator it=tr[x].lj.begin();it!=tr[x].lj.end();it++)
{
int sx=*it;
if(sx!=fa)
{
bfs(sx,x);
tr[x].size+=tr[sx].size;
if(tr[sx].size>tr[tr[x].spson].size||tr[x].spson==-1)
tr[x].spson=sx;
}
}
return;
}
void dfs(int x,int fa,int v,int rt)
{
cx[tr[x].ys]+=v;
if(v==1)
{
if(cx[tr[x].ys]>cx[tr[rt].ans]) tr[rt].ans=tr[x].ys,tr[rt].aans=tr[x].ys;
else if(cx[tr[x].ys]==cx[tr[rt].ans])
tr[rt].aans+=tr[x].ys;
}
for(vector<int>::iterator it=tr[x].lj.begin();it!=tr[x].lj.end();it++)
{
int sx=*it;
if(sx!=fa)
dfs(sx,x,v,rt);
}
}
void qiu(int x,int fa,int op)
{
for(vector<int>::iterator it=tr[x].lj.begin();it!=tr[x].lj.end();it++)
{
int sx=*it;
if(sx!=fa&&sx!=tr[x].spson)
qiu(sx,x,1);
}
if(tr[x].spson!=-1) qiu(tr[x].spson,x,0);
if(tr[x].spson!=-1) tr[x].ans=tr[tr[x].spson].ans,tr[x].aans=tr[tr[x].spson].aans;
for(vector<int>::iterator it=tr[x].lj.begin();it!=tr[x].lj.end();it++)
{
int sx=*it;
if(sx!=fa&&sx!=tr[x].spson)
dfs(sx,x,1,x);
}
cx[tr[x].ys]++;
if(cx[tr[x].ys]>cx[tr[x].ans])
tr[x].ans=tr[x].ys,tr[x].aans=tr[x].ys;
else if(cx[tr[x].ys]==cx[tr[x].ans])
tr[x].aans+=tr[x].ys;
if(op)
{
cx[tr[x].ys]--;
for(vector<int>::iterator it=tr[x].lj.begin();it!=tr[x].lj.end();it++)
{
int sx=*it;
if(sx!=fa)
dfs(sx,x,-1,x);
}
}
return;
}
signed main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&tr[i].ys);
for(int i=1;i<n;i++)
{
int f,r;
scanf("%d%d",&f,&r);
tr[f].lj.push_back(r);
tr[r].lj.push_back(f);
}
bfs(1,0);
qiu(1,0,0);
for(int i=1;i<=n;i++)
printf("%d ",tr[i].aans);
return 0;
}
rt