#include #include #include using namespace std; typedef pair ii; typedef vector > vii; typedef vector vi; vector dfs_num; vector > graph; int dfs(int u){ dfs_num[u] = 1; int s = 1; for (int j = 0; j < (int)graph[u].size(); j++){ int v = graph[u][j]; if (dfs_num[v] == -1){ s += dfs(v); } } return s; } int V; int w[300010]; vii edges; int main(void){ scanf("%d", &V); long long sum = 0; for(int i = 0; i < V; i++){ scanf("%d", &(w[i])); sum += w[i]; } for(int i = 0; i < V-1; i++){ int a,b; scanf("%d %d", &a, &b); edges.push_back({a,b}); } //alg for(int b = 0; b < 20; b++){ graph = vector >(V,vector()); for(int i = 0; i < V-1; i++){ ii e = edges[i]; if (w[e.first] & w[e.second] & (1 << b)) { graph[e.first].push_back(e.second); graph[e.second].push_back(e.first); } } dfs_num.assign(V, -1); for(int i = 0; i < V; i++){ if(dfs_num[i] == -1){ long long s = dfs(i); sum += (1 << b)*(s*(s-1))/2; } } } printf("%lld\n",sum); return 0; }