#include <bits/stdc++.h>

#define name "vestonluvto"
const char* namein = name ".inp";
const char* nameout = name ".out";

#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define PI 3.141592653589793238462
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define pb emplace_back

using namespace std;

#ifndef LOCAL
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif

void _print(int t) {cerr << t;}
void _print(long long t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(long double t) {cerr << t;}
void _print(double t) {cerr << t;}
void _print(unsigned long long t) {cerr << t;}

template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.first); cerr << ","; _print(p.second); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}

void homefix(){
    #ifndef LOCAL
    #endif
}

void home(){
     homefix();
     if (fopen(namein, "r")) {
        freopen(namein, "r", stdin);
        freopen(nameout, "w", stdout);
     }
}

const int MAXN = 2e5 + 5;
int n;
long long a[MAXN];
vector<int> dt[MAXN];

map<int, int> mp[MAXN];
int max_freq[MAXN];
long long sum_max[MAXN];
long long ans[MAXN];

void nhap(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i < n; i++){
        int u, v;
        cin >> u >> v;
        dt[u].pb(v);
        dt[v].pb(u);
    }
}

void dfs(int u, int p){
    mp[u][a[u]] = 1;
    max_freq[u] = 1;
    sum_max[u] = a[u];

    for(int &v : dt[u]){
        if(v == p) continue;
        dfs(v, u);
        
        if(sz(mp[u]) < sz(mp[v])){
            swap(mp[u], mp[v]);
            swap(max_freq[u], max_freq[v]);
            swap(sum_max[u], sum_max[v]);
        }
        
        for(auto &k : mp[v]){
            int col = k.first;
            int f = k.second;
            mp[u][col] += f;
            int cur_f = mp[u][col];
            
            if(cur_f > max_freq[u]){
                max_freq[u] = cur_f;
                sum_max[u] = col;
            } else if(cur_f == max_freq[u]){
                sum_max[u] += col;
            }
        }
        mp[v].clear();
    }
    ans[u] = sum_max[u];
}

void solve(){
    dfs(1, 0);
    for(int i = 1; i <= n; i++){
        cout << ans[i] << ' ';
    }
}

int main(){
    fastio(); 
    home();
    int t = 1;
    while(t--){
        nhap();
        solve();
    }
    return 0;
}
