func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long inf = 0x3f3f3f3f;   unordered_map<int, int> cnt;   int maxi = 0;   int x[100005];   int head[100005], ne[200005], to[200005];   int idx = 0;   int son[100005];   int sz[100005];   long long sum = 0;   long long s[100005];   void Insert(int a, int b) {     to[++idx] = b;     ne[idx] = head[a];     head[a] = idx;   }   void Add(int root, int fa) {     cnt[x[root]]++;     if (cnt[x[root]] == maxi) {       sum += x[root];     } else if (cnt[x[root]] > maxi) {       maxi = cnt[x[root]];       sum = x[root];     }     for (int i = head[root]; i != -1; i = ne[i]) {       int a = to[i];       if (a == fa) continue;       Add(a, root);     }   }   void dfs1(int root, int fa) {     sz[root] = 1;     for (int i = head[root]; i != -1; i = ne[i]) {       int a = to[i];       if (a == fa) continue;       dfs1(a, root);       sz[root] += sz[a];       if (sz[a] > sz[son[root]]) {         son[root] = a;       }     }   }   void dfs2(int root, int fa) {     for (int i = head[root]; i != -1; i = ne[i]) {       int a = to[i];       if (a == fa || a == son[root]) continue;       dfs2(a, root);       maxi = 0;       sum = 0;       cnt.clear();     }     if (son[root]) dfs2(son[root], root);     for (int i = head[root]; i != -1; i = ne[i]) {       int a = to[i];       if (a == fa || a == son[root]) continue;       Add(a, root);     }     cnt[x[root]]++;     if (cnt[x[root]] == maxi) {       sum += x[root];     } else if (cnt[x[root]] > maxi) {       maxi = cnt[x[root]];       sum = x[root];     }     s[root] = sum;   }   int main() {     int n;     memset(head, -1, sizeof(head));     cin >> n;     for (int i = 1; i <= n; i++) {       scanf( %d , &x[i]);     }     for (int i = 1; i < n; i++) {       int a, b;       scanf( %d%d , &a, &b);       Insert(b, a);       Insert(a, b);     }     dfs1(1, 0);     dfs2(1, 0);     for (int i = 1; i <= n; i++) {       printf( %lld%c , s[i], i == n ?   n  :    );     }     return 0;   }   