#include <bits/stdc++.h>
#define ll long long

using namespace std;

constexpr int N = 2e5 + 5;
int n;
set<int> adj[N];
vector<int> tree[N], col(N), par(N), ans(N);

int find(int u){
    if(u == par[u]){
        return u;
    }
    return par[u] = find(par[u]);
}

void unite(int x, int y){
    x = find(x);
    y = find(y);
    if (x == y)
        return ;
    if(adj[x].size() < adj[y].size()) swap(x, y);
    par[y] = x;
    for(int v : adj[y]){
        adj[x].insert(v);
    }
}

void dfs(int u, int p){
    for(int v : tree[u]){
        if(v != p){
            dfs(v, u);
            unite(u, v);
        }
    }
    ans[u] = adj[find(u)].size();
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n;
    for(int i = 1; i < n + 1; i++){
        cin >> col[i];
        adj[i].insert(col[i]);
        par[i] = i;
    }
    for(int i = 1; i < n; i++){
        int u, v;
        cin >> u >> v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
    dfs(1, -1);
    for(int i = 1; i < n + 1; i++){
        cout << ans[i] << " ";
    }
    cout << "\n";
    return 0;
}
