func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 10;   const int LG = 20;   int n, a[N], u, v;   long long dp[LG][N][2];   long long sdp[LG][N][2];   long long ans, ans2;   vector<int> G[N];   bool mark[N];   int h[N];   void input();   void find_ans();   void dfs(int, int);   int main() {     input();     for (int i = 0; i < LG; i++) {       dfs(0, i);       fill(mark, mark + n, false);     }     find_ans();     cout << ans + (ans2 / 2) << endl;   }   void input() {     cin >> n;     for (int i = 0; i < n; i++) cin >> a[i];     for (int i = 0; i < n - 1; i++) {       cin >> u >> v;       u--, v--;       G[u].push_back(v);       G[v].push_back(u);     }   }   void dfs(int x, int z) {     mark[x] = true;     for (int i = 0; i < G[x].size(); i++) {       int y = G[x][i];       if (!mark[y]) {         h[y] = h[x] + 1;         dfs(y, z);         dp[z][x][0] += dp[z][y][(a[x] >> z) & 1];         dp[z][x][1] += dp[z][y][1 - ((a[x] >> z) & 1)];         sdp[z][x][0] += dp[z][y][0];         sdp[z][x][1] += dp[z][y][1];       }     }     dp[z][x][(a[x] >> z) & 1]++;   }   void find_ans() {     for (int i = 0; i < LG; i++)       for (int j = 0; j < n; j++) ans += (dp[i][j][1] * (1 << i));     for (int i = 0; i < LG; i++)       for (int j = 0; j < n; j++)         for (int k = 0; k < G[j].size(); k++) {           int x = G[j][k];           if (h[x] > h[j]) {             ans2 += (dp[i][x][1]) *                     (sdp[i][j][(a[j] >> i) & 1] - dp[i][x][(a[j] >> i) & 1]) *                     (1 << i);             ans2 += (dp[i][x][0]) *                     (sdp[i][j][1 - ((a[j] >> i) & 1)] -                      dp[i][x][1 - ((a[j] >> i) & 1)]) *                     (1 << i);           }         }   }   