func_code_string: #include <bits/stdc++.h>   using namespace std;   char buf[1 << 20], *p1, *p2;   template <typename T>   inline void read(T &t) {     register int v =         (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)              ? EOF              : *p1++);     T f = 1;     t = 0;     while (!isdigit(v)) {       if (v ==  - ) f = -1;       v = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)                ? EOF                : *p1++);     }     while (isdigit(v)) {       t = t * 10 + v - 48;       v = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)                ? EOF                : *p1++);     }     t *= f;   }   template <typename T, typename... Args>   inline void read(T &t, Args &...args) {     read(t);     read(args...);   }   const int N = 100001;   const int M = 200010;   template <typename T>   inline T min(T x, T y) {     return x < y ? x : y;   }   template <typename T>   inline T max(T x, T y) {     return x > y ? x : y;   }   int to[M], hd[N], nxt[M], tot;   inline void add(int u, int v) {     to[++tot] = v;     nxt[tot] = hd[u];     hd[u] = tot;   }   inline void addedge(int u, int v) { add(u, v), add(v, u); }   long long son[N], siz[N], cnt[N], col[N], sum, Son, maxx, n, ans[N];   void dfs1(int u, int f) {     siz[u] = 1;     son[u] = 0;     for (int i = hd[u]; i; i = nxt[i]) {       int v = to[i];       if (v != f) {         dfs1(v, u);         siz[u] += siz[v];         if (siz[v] > siz[son[u]]) {           son[u] = v;         }       }     }   }   void add(int u, int f, int val) {     cnt[col[u]] += val;     if (cnt[col[u]] > maxx)       maxx = cnt[col[u]], sum = col[u];     else if (cnt[col[u]] == maxx)       sum += col[u];     for (int i = hd[u]; i; i = nxt[i]) {       int v = to[i];       if (v != f && v != Son) {         add(v, u, val);       }     }   }   void dfs2(int u, int f, int opt) {     for (int i = hd[u]; i; i = nxt[i]) {       int v = to[i];       if (v != f && v != son[u]) {         dfs2(v, u, 0);       }     }     if (son[u]) dfs2(son[u], u, 1), Son = son[u];     add(u, f, 1), Son = 0;     ans[u] = sum;     if (opt == 0) add(u, f, -1), sum = maxx = 0;   }   signed main() {     read(n);     for (int i = 1; i <= n; ++i) read(col[i]);     for (int i = 1; i < n; ++i) {       int x, y;       read(x, y);       addedge(x, y);     }     dfs1(1, 0);     dfs2(1, 0, 0);     for (int i = 1; i <= n; ++i) printf( %lld  , ans[i]);     return 0;   }   