#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#include <sstream>
#include <map>
#include <set>
typedef long long ll;
using namespace std;
const int N=100005;
int dep[N],siz[N],fa[N],son[N]; //dfs1求出每个节点的深度、大小、父亲节点、重儿子节点
int n;
int vis[N],num[N],top;
ll c[N],sum[N],ans[N];
struct node
{
    int v; //边的终点
    //如果边有权值的话,加上int w;代表边的权值
    int nex;
}e[N<<1];

int first[N],tot; //first数组是链式向前星的前一个数组
void init() //初始化
{
    tot=0; //tot是链式向前星记录边个数的变量
    top=0;
    memset(first,-1,sizeof(first)); //链式向前星的first数组一般设为-1
}
void adde(int u,int v)
{
    e[tot].v=v;
    e[tot].nex=first[u];
    first[u]=tot++;
}

void dfs1(int u,int pre,int depth) //从根节点1开始,上一个节点是0,深度是1,最后标记每一个节点的dep(深度),fa(父亲节点),siz(大小),son(重儿子节点)
{
    dep[u]=depth;
    fa[u]=pre;
    siz[u]=1;
    for(int i=first[u];i!=-1;i=e[i].nex) //遍历u节点的儿子节点
    {
        int v=e[i].v; //这条边的终点
        if(v==pre) continue;  //如果终点等于他的父亲节点就continue;
        dfs1(v,u,depth+1);              //节点变为这条边的终点,父亲节点是u节点,每次的深度+1
        /*一直dfs,直到到达叶子节点,然后从下到上更新每个节点的size数组*/
        if(siz[son[u]]<siz[v]) son[u]=v;//如果现在重儿子的大小 < 当前终点节点的大小,更新重儿子为v
        siz[u]+=siz[v]; //u的大小都要加上终点的大小
    }
}

void update(int u,int pre,int t)
{
    sum[num[c[u]]]-=c[u];
    num[c[u]]+=t;
    sum[num[c[u]]]+=c[u];
    if(sum[top+1]) top++;
    if(!sum[top]) top--;
    for(int i=first[u];~i;i=e[i].nex)
    {
        int v=e[i].v;
        if(v==pre||vis[v]) continue;
        update(v,u,t);  //合并没被保留下来的子节点
    }
}

void dfs2(int u,int pre,int so) //从根节点1,父亲节点0,so是1开始
{
    for(int i=first[u];i!=-1;i=e[i].nex) //遍历与u相连的点
    {
        int v=e[i].v;
        if(v==pre||v==son[u]) continue; //如果是父节点或者是重儿子(意思就是:如果是父亲节点本来就不算,如果是重儿子节点,就先跳过)
        dfs2(v,u,0); //如果u的儿子节点v 是u的轻儿子节点
    }
    if(son[u]) //最后遍历重儿子
    {
        dfs2(son[u],u,1);
        vis[son[u]]=1;  //标记保留下来的节点
    }
    update(u,pre,1);
    vis[son[u]]=0;
    ans[u]=sum[top]; //记录答案
    if(so==0) update(u,pre,-1); //如果不是重节点清除数组
}

int main()
{
    scanf("%d",&n);
    init();
    for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
    int u,v;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        /*添加双向边*/
        adde(u,v);
        adde(v,u);
    }
    dfs1(1,0,1);
    dfs2(1,0,1);
    for(int i=1;i<=n;i++) printf("%lld ",ans[i]);
    printf("\n");
    return 0;
}