func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 5;   int n, col[N], maxx, cnt[N], p[N], eid, Son, mx[N], sz[N];   long long sum, ans[N];   struct edge {     int v, nxt;   } e[N << 1];   inline void addedge(int u, int v) { e[++eid] = (edge){v, p[u]}, p[u] = eid; }   inline void dfs0(int u, int fa) {     sz[u] = 1;     for (int i = p[u]; i; i = e[i].nxt)       if (e[i].v != fa) {         int v = e[i].v;         dfs0(v, u), sz[u] += sz[v];         if (sz[v] > sz[mx[u]]) mx[u] = v;       }   }   inline void add(int u, int fa, int d) {     cnt[col[u]] += d;     if (cnt[col[u]] > maxx)       maxx = cnt[col[u]], sum = col[u];     else if (cnt[col[u]] == maxx)       sum += col[u];     for (int i = p[u]; i; i = e[i].nxt)       if (e[i].v != fa && e[i].v != Son) add(e[i].v, u, d);   }   inline void dfs(int u, int fa, int d) {     for (int i = p[u]; i; i = e[i].nxt)       if (e[i].v != fa && e[i].v != mx[u]) dfs(e[i].v, u, 0);     if (mx[u]) dfs(mx[u], u, 1), Son = mx[u];     add(u, fa, 1), Son = 0, ans[u] = sum;     if (!d) add(u, fa, -1), sum = maxx = 0;   }   int main() {     scanf( %d , &n);     for (int i = (1); i <= (n); i++) scanf( %d , &col[i]);     for (int i = (1); i <= (n - 1); i++) {       int u, v;       scanf( %d%d , &u, &v);       addedge(u, v), addedge(v, u);     }     dfs0(1, 0), dfs(1, 0, 0);     for (int i = (1); i <= (n); i++) printf( %lld  , ans[i]);     return 0;   }   