#include <bits/stdc++.h>   using namespace std;   const int TAM = 100000 + 15;   const long long MOD = 1000000007LL;   const double PI = 3.14159265359;   long long add(long long x, long long y) { return (x + y + 2 * MOD) % MOD; }   long long mult(long long x, long long y) {     return (add(x, 0) * add(y, 0)) % MOD;   }   long long fast_expo(long long x, long long y) {     if (x == 0) return 0;     if (y == 0) return 1;     long long res = 1;     long long mid = fast_expo(x, y / 2);     if (y % 2 != 0) res = x;     return mult(mult(mid, mid), res);   }   long long inver(long long x) { return fast_expo(x, MOD - 2); }   long long gcd(long long e1, long long e2) {     if (e2 == 0) return e1;     return gcd(e2, e1 % e2);   }   int n;   map<int, int> mapa[TAM];   int color[TAM];   vector<int> G[TAM];   long long dom[TAM];   int tam[TAM];   int cant[TAM];   void dfs_tam(int u, int pd = -1) {     tam[u] = 1;     for (int v : G[u]) {       if (v != pd) {         dfs_tam(v, u);         tam[u] += tam[v];       }     }   }   void dfs(int u, int pd = -1) {     int m = -1, val = -1;     for (int v : G[u]) {       if (v != pd) {         if (tam[v] > val) {           m = v;           val = tam[v];         }       }     }     if (m == -1) {       mapa[u][color[u]]++;       dom[u] = color[u];       cant[u] = 1;       return;     }     for (int v : G[u]) {       if (v != pd) {         dfs(v, u);       }     }     swap(mapa[u], mapa[m]);     dom[u] = dom[m];     cant[u] = cant[m];     mapa[u][color[u]]++;     if (mapa[u][color[u]] > cant[u]) {       cant[u] = mapa[u][color[u]];       dom[u] = 1LL * color[u];     } else if (mapa[u][color[u]] == cant[u]) {       dom[u] += 1LL * color[u];     }     for (int v : G[u]) {       if (v != pd && v != m) {         int k, t;         for (map<int, int>::iterator it = mapa[v].begin(); it != mapa[v].end();              it++) {           k = it->first;           t = it->second;           mapa[u][k] += t;           if (mapa[u][k] > cant[u]) {             cant[u] = mapa[u][k];             dom[u] = 1LL * k;           } else if (mapa[u][k] == cant[u]) {             dom[u] += 1LL * k;           }         }       }     }   }   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) scanf( %d , &color[i]);     int u, v;     for (int i = 0; i < n - 1; i++) {       scanf( %d%d , &u, &v);       G[u - 1].push_back(v - 1);       G[v - 1].push_back(u - 1);     }     dfs_tam(0);     dfs(0);     for (int i = 0; i < n; i++) cout << 1LL * dom[i] <<    ;     cout << endl;     return 0;   }   