#include using namespace std; const int N = 3e5 + 7; int tab[22][N]; int wiel[22][N]; bool byl[22][N]; int A[N]; int Find(int x,int a) { if(tab[x][a] == a)return a; return tab[x][a] = Find(x,tab[x][a]); } void Union(int x,int a,int b) { a = Find(x,a); b = Find(x,b); if(wiel[x][a] > wiel[x][b]) swap(a,b); wiel[x][b] += wiel[x][a]; tab[x][a] = tab[x][b]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); for(int i = 0 ; i < 22; i++) { for(int j = 0 ; j < N; j++) { tab[i][j] = j; wiel[i][j] = 1; } } int n; cin >> n; long long res = 0; for(int i = 0 ; i < n; i++) { cin >> A[i]; res += A[i]; } for(int i = 0 ; i < n - 1; i++) { int a , b; cin >> a >> b; for(int j = 0 ; j < 22; j++) { if((A[a] & (1 << j)) && (A[b] & (1 << j))) { Union(j,a,b); } } } for(int j = 0 ; j < 22; j++) { for(int i = 0 ; i < n;i++) { int id = Find(j,i); if(byl[j][id])continue; byl[j][id] = true; res += 1ll * j * wiel[j][id] * (wiel[j][id] - 1) / 2; } } cout << res; return 0; }