#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);
        }
      }
}
