func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100000 + 7;   int n;   int val[N];   struct edge {     int to, nex;   } e[N << 1];   int fir[N], eid;   int siz[N], fa[N], son[N];   int dfn[N], pos[N], inx;   int cnt[N], res[N];   long long mul[N], ans[N];   void addedge(int u, int v) {     e[++eid] = (edge){v, fir[u]};     fir[u] = eid;   }   void hld(int s) {     siz[s] = 1;     pos[dfn[s] = ++inx] = s;     for (int i = fir[s]; i; i = e[i].nex)       if (e[i].to != fa[s])         fa[e[i].to] = s, hld(e[i].to), siz[s] += siz[e[i].to],         son[s] = siz[e[i].to] > siz[son[s]] ? e[i].to : son[s];   }   void dfs(int s, int rem) {     for (int i = fir[s]; i; i = e[i].nex)       if (e[i].to != fa[s] && e[i].to != son[s]) dfs(e[i].to, 0);     if (son[s]) dfs(son[s], 1);     int c = val[s];     mul[cnt[c]] -= c, mul[++cnt[c]] += c, res[s] = max(res[son[s]], cnt[c]);     for (int i = fir[s]; i; i = e[i].nex) {       if (e[i].to == fa[s] || e[i].to == son[s]) continue;       for (int j = dfn[e[i].to], c; j < dfn[e[i].to] + siz[e[i].to]; ++j)         c = val[pos[j]], mul[cnt[c]] -= c, mul[++cnt[c]] += c,         res[s] = max(res[s], cnt[c]);     }     ans[s] = mul[res[s]];     if (rem) return;     memset(cnt, 0, sizeof(int) * (n + 2));     memset(mul, 0, sizeof(long long) * (res[s] + 2));   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; ++i) scanf( %d , val + i);     for (int i = 1, u, v; i < n; ++i)       scanf( %d%d , &u, &v), addedge(u, v), addedge(v, u);     hld(1);     dfs(1, 1);     for (int i = 1; i <= n; ++i) printf( %I64d  , ans[i]);     return 0;   }   