Rt.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define rep1(i,x,y) for(register int i=x;i>=y;--i)
#define in(x) scanf("%lld",&x)
#define fire signed
#define il inline
il void print(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) print(x/10);
putchar(x%10+'0');
}
int T=1;
const int N=1e5+10;
vector<int>v[N];
int n;
struct node{
int Max,now;
int l,r;
}tr[N<<5];
void up(int x) {
tr[x].Max=max(tr[tr[x].l].Max,tr[tr[x].r].Max);
int xx=false;
if(tr[x].Max==tr[tr[x].l].Max) xx+=tr[tr[x].l].now;
if(tr[x].Max==tr[tr[x].r].Max) xx+=tr[tr[x].r].now;
tr[x].now=xx;
}
int tot;
void modify(int &u,int l,int r,int k) {
if(!u) u=++tot;
if(l==r) {
tr[u].Max++;
tr[u].now+=k;
return;
}
int mid=l+r>>1;
if(mid>=k) modify(tr[u].l,l,mid,k);
else modify(tr[u].r,mid+1,r,k);
up(u);
}
int merge(int a,int b,int l,int r) {
if(!a||!b) return a+b;
if(l==r) {
tr[a].Max+=tr[b].Max;
tr[a].now=l*tr[a].Max;
return a;
}
int mid=l+r>>1;
tr[a].l=merge(tr[a].l,tr[b].l,l,mid);
tr[a].r=merge(tr[a].r,tr[b].r,mid+1,r);
up(a);
return a;
}
int rt[N],res[N];
void dfs(int x,int fa) {
for(auto to:v[x]) {
if(to==fa) continue;
dfs(to,x);
merge(rt[x],rt[to],1,N);
}
res[x]=tr[rt[x]].now;
}
void solve() {
in(n);
rep(i,1,n) {
int x;
in(x);
modify(rt[i],1,N,x);
}
rep(i,1,n-1) {
int x,y;
in(x),in(y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0);
rep(i,1,n) printf("%lld ",res[i]);
return;
}
fire main() {
while(T--) {
solve();
}
return false;
}