#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mxn = 2e5 + 10;
int w[mxn];
vector<int> g[mxn];
ll dp[mxn][2];
ll total_paths_with_bit;
void dfs(int u, int p, int bit) {
int b = (w[u] >> bit) & 1;
dp[u][b] = 1;
dp[u][1 - b] = 0;
total_paths_with_bit += dp[u][1];
for (int v : g[u]) {
if (v == p) continue;
dfs(v, u, bit);
total_paths_with_bit += (dp[u][0] * dp[v][1] + dp[u][1] * dp[v][0]);
if (b == 0) {
dp[u][0] += dp[v][0];
dp[u][1] += dp[v][1];
} else {
dp[u][0] += dp[v][1];
dp[u][1] += dp[v][0];
}
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n;
if (!(cin >> n)) return 0;
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
ll final_ans = 0;
for (int i = 0; i <= 30; i++) {
total_paths_with_bit = 0;
dfs(1, 0, i);
final_ans += (total_paths_with_bit * (1LL << i));
}
cout << final_ans << endl;
return 0;
}