func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T, typename L>   bool smax(T &x, L y) {     return x < y ? (x = y, true) : false;   }   template <typename T, typename L>   bool smin(T &x, L y) {     return y < x ? (x = y, true) : false;   }   void pre_dfs(int, int);   void sack(int, int, bool);   void update(int, int, int, int, int);   const int MAXN = 1e5 + 15;   int cnt[MAXN], col[MAXN];   int st[MAXN], ft[MAXN], add[MAXN];   vector<int> adj[MAXN];   int n;   long long ans[MAXN];   pair<int, long long> tree[MAXN << 2];   int main() {     ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);     cerr <<  HELLO WORLD :) n ;     cin >> n;     for (int i = 0; i < n; i++) cin >> col[i];     for (int i = 1; i < n; i++) {       int u, v;       cin >> u >> v;       u--, v--;       adj[u].push_back(v);       adj[v].push_back(u);     }     pre_dfs(0, -1);     sack(0, -1, 0);     for (int i = 0; i < n; i++) cout << ans[i] <<    ;     return cout <<   n , false;   }   void pre_dfs(int v, int p) {     static int t = 0;     st[v] = t++;     add[st[v]] = v;     for (auto u : adj[v])       if (u != p) pre_dfs(u, v);     ft[v] = t;   }   void sack(int v, int p, bool keep) {     int id = -1, mx = -1061109567;     for (auto u : adj[v])       if (u != p && smax(mx, ft[u] - st[u])) id = u;     for (auto u : adj[v])       if (u != p && u != id) sack(u, v, 0);     if (id != -1) sack(id, v, 1);     update(1, 1, n + 1, col[v], 1);     for (auto u : adj[v])       if (u != p && u != id)         for (int i = st[u]; i < ft[u]; i++) update(1, 1, n + 1, col[add[i]], 1);     ans[v] = tree[1].second;     if (!keep)       for (int i = st[v]; i < ft[v]; i++) update(1, 1, n + 1, col[add[i]], -1);   }   void update(int id, int b, int e, int p, int val) {     if (b == e - 1) {       tree[id].first += val;       smax(tree[id].second, b);       return;     }     int mid = (b + e) >> 1;     if (p < mid)       update(id << 1, b, mid, p, val);     else       update(id << 1 | 1, mid, e, p, val);     tree[id].first = max(tree[id << 1].first, tree[id << 1 | 1].first);     tree[id].second = (tree[id << 1].first == tree[id << 1 | 1].first                            ? tree[id << 1].second + tree[id << 1 | 1].second                            : (tree[id << 1].first > tree[id << 1 | 1].first                                   ? tree[id << 1].second                                   : tree[id << 1 | 1].second));   }   