#include <bits/stdc++.h>
using namespace std;
bool vals[100000][32] = {0};
vector<int> adjlist[100000];
long long int dp[100000][32][2] = {0};
long long int sol[32] = {0};
void dfs(int cur, int prev) {
  long long int temp[32][2] = {0};
  for (int i = 0; i < 32; i++) {
    dp[cur][i][vals[cur][i]] = 1;
  }
  int s = adjlist[cur].size();
  for (int i = 0; i < s; i++) {
    if (adjlist[cur][i] == prev) continue;
    dfs(adjlist[cur][i], cur);
    for (int j = 0; j < 32; j++) {
      dp[cur][j][0] += dp[adjlist[cur][i]][j][vals[cur][j]];
      temp[j][0] += dp[adjlist[cur][i]][j][0];
      dp[cur][j][1] += dp[adjlist[cur][i]][j][vals[cur][j] ^ 1];
      temp[j][1] += dp[adjlist[cur][i]][j][1];
    }
  }
  for (int i = 0; i < 32; i++) {
    long long int acc = 0;
    for (int j = 0; j < s; j++) {
      if (adjlist[cur][j] == prev) continue;
      if (vals[cur][i]) {
        acc += (temp[i][1] - dp[adjlist[cur][j]][i][1]) *
               dp[adjlist[cur][j]][i][1];
        acc += (temp[i][0] - dp[adjlist[cur][j]][i][0]) *
               dp[adjlist[cur][j]][i][0];
      } else {
        acc += (temp[i][1] - dp[adjlist[cur][j]][i][1]) *
               dp[adjlist[cur][j]][i][0];
        acc += (temp[i][0] - dp[adjlist[cur][j]][i][0]) *
               dp[adjlist[cur][j]][i][1];
      }
    }
    sol[i] += acc / 2;
    sol[i] += dp[cur][i][1];
  }
}
int main() {
  for (int i = 0; i < 32; i++) sol[i] = 0;
  for (int i = 0; i < 100000; i++)
    for (int j = 0; j < 32; j++)
      for (int k = 0; k < 2; k++) dp[i][j][k] = 0;
  long long int n, u, v;
  unsigned long long int temp;
  const unsigned long long int one = 1;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> temp;
    for (unsigned long long int j = 0; j < 32; j++) {
      vals[i][j] = ((temp & (one << j)) ? true : false);
    }
  }
  for (int i = 0; i < n - 1; i++) {
    cin >> u >> v;
    adjlist[u - 1].push_back(v - 1);
    adjlist[v - 1].push_back(u - 1);
  }
  dfs(0, -1);
  unsigned long long int tot = 0;
  for (unsigned long long int i = 0; i < 32; i++) {
    tot += (sol[i] * (one << i));
  }
  cout << tot << endl;
}
