#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const long double pi = acos(-1.0);
const string debug_line = "yolo";
const long double PI = acos((long double)-1.0);
const long double eps = 1e-6;
unsigned long long getRand() {
  return ((unsigned long long)rand() << 40) +
         ((unsigned long long)rand() << 20) + ((unsigned long long)rand());
}
long long answer1 = 0;
vector<int> Adj[100010];
long long a1[100010];
int dp1[100010][20][2];
void addAnswer(int u, int c, int val1) {
  for (int(i) = (0); (i) < (20); ++(i)) {
    if (val1 & (1 << i)) {
      dp1[u][i][0] += dp1[c][i][1];
      dp1[u][i][1] += dp1[c][i][0];
    } else {
      dp1[u][i][0] += dp1[c][i][0];
      dp1[u][i][1] += dp1[c][i][1];
    }
  }
}
void addVal(int u, int val1) {
  for (int(i) = (0); (i) < (20); ++(i)) {
    if (val1 & (1 << i)) {
      dp1[u][i][1]++;
    } else {
      dp1[u][i][0]++;
    }
  }
}
void DFS(int u, int p) {
  for (auto &(t1) : (Adj[u])) {
    if (t1 != p) {
      DFS(t1, u);
      addAnswer(u, t1, a1[u]);
    }
  }
  addVal(u, a1[u]);
}
void assignValue(vector<vector<int> > &arr, int u) {
  for (int(i) = (0); (i) < (20); ++(i)) {
    for (int(j) = (0); (j) < (2); ++(j)) {
      arr[i][j] = dp1[u][i][j];
    }
  }
}
void addValue(vector<vector<int> > &nowAnwer, vector<vector<int> > p,
              int val1) {
  for (int(i) = (0); (i) < (20); ++(i)) {
    if (val1 & (1 << i)) {
      swap(p[i][0], p[i][1]);
    }
  }
  for (int(i) = (0); (i) < (20); ++(i)) {
    for (int(j) = (0); (j) < (2); ++(j)) {
      nowAnwer[i][j] += p[i][j];
    }
  }
}
void modifyAnswer(vector<vector<int> > &nowAnwer, int c, int val1, int sign) {
  for (int(i) = (0); (i) < (20); ++(i)) {
    if ((1 << i) & val1) {
      nowAnwer[i][0] += dp1[c][i][1] * sign;
      nowAnwer[i][1] += dp1[c][i][0] * sign;
    } else {
      nowAnwer[i][0] += dp1[c][i][0] * sign;
      nowAnwer[i][1] += dp1[c][i][1] * sign;
    }
  }
}
long long getAns(int u, vector<vector<int> > prev) {
  long long answer1 = 0;
  for (int(i) = (0); (i) < (20); ++(i)) {
    if (a1[u] & (1 << i)) {
      answer1 = answer1 + (1 << i) * (long long)prev[i][0];
    } else {
      answer1 = answer1 + (1 << i) * (long long)prev[i][1];
    }
  }
  for (int(i) = (0); (i) < (20); ++(i)) {
    answer1 += (1 << i) * (long long)dp1[u][i][1];
  }
  return answer1;
}
void revDFS(int u, int p, vector<vector<int> > prev) {
  answer1 += getAns(u, prev);
  vector<vector<int> > nowAnswer;
  nowAnswer.resize(20, vector<int>(2, 0));
  assignValue(nowAnswer, u);
  addValue(nowAnswer, prev, a1[u]);
  for (auto &(t1) : (Adj[u])) {
    if (t1 != p) {
      modifyAnswer(nowAnswer, t1, a1[u], -1);
      revDFS(t1, u, nowAnswer);
      modifyAnswer(nowAnswer, t1, a1[u], +1);
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int(i) = (1); (i) < (n + 1); ++(i)) {
    long long temp;
    scanf("%lld", &temp);
    a1[i] = temp;
  }
  for (int(i) = (1); (i) < (n); ++(i)) {
    int a1, b1;
    scanf("%d%d", &a1, &b1);
    Adj[a1].push_back(b1);
    Adj[b1].push_back(a1);
  }
  DFS(1, 0);
  vector<vector<int> > prev;
  prev.resize(20, vector<int>(2, 0));
  revDFS(1, 0, prev);
  for (int(i) = (1); (i) < (n + 1); ++(i)) {
    answer1 -= (long long)a1[i];
  }
  answer1 = answer1 / 2;
  for (int(i) = (1); (i) < (n + 1); ++(i)) {
    answer1 += (long long)a1[i];
  }
  printf("%lld\n", answer1);
  return 0;
}
