Problem: Kuroni isn't good at economics. So he decided to found a new financial pyramid called Antihype. It has the following rules:

  1. You can join the pyramid for free and get 0 coins. 
  2. If you are already a member of Antihype, you can invite your friend who is currently not a member of Antihype, and get a number of coins equal to your age (for each friend you invite). 



n people have heard about Antihype recently, the i-th person's age is a_i. Some of them are friends, but friendship is a weird thing now: the i-th person is a friend of the j-th person if and only if a_i  AND  a_j = 0, where AND denotes the [bitwise AND operation](https://en.wikipedia.org/wiki/Bitwise_operation#AND).

Nobody among the n people is a member of Antihype at the moment. They want to cooperate to join and invite each other to Antihype in a way that maximizes their combined gainings. Could you help them? 

Input

The first line contains a single integer n (1≤ n ≤ 2⋅ 10^5) — the number of people.

The second line contains n integers a_1, a_2, ..., a_n (0≤ a_i ≤ 2⋅ 10^5) — the ages of the people.

Output

Output exactly one integer — the maximum possible combined gainings of all n people.

Example

Input


3
1 2 3


Output


2

Note

Only the first and second persons are friends. The second can join Antihype and invite the first one, getting 2 for it.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5, maxa = 3e5 + 5;
const int A = 262143, MX = 17;
int n, a[maxn];
int ga[maxa];
int get(int x) { return ga[x] == x ? x : ga[x] = get(ga[x]); }
int dp1[maxa], dp2[maxa];
void sos() {
  memset(dp1, 255, sizeof(dp1));
  memset(dp2, 255, sizeof(dp2));
  for (int i = 0; i <= n; i++)
    if (dp1[a[i]] == -1 || a[i] > a[dp1[a[i]]])
      dp2[a[i]] = dp1[a[i]], dp1[a[i]] = i;
    else if ((dp2[a[i]] == -1 || a[i] > a[dp2[a[i]]]) &&
             get(i) != get(dp1[a[i]]))
      dp2[a[i]] = i;
  for (int w = 0; w <= MX; w++)
    for (int i = 0; i <= A; i++)
      if (i & (1 << w)) {
        int j = i ^ (1 << w);
        if (dp1[i] == -1 || a[dp1[j]] > a[dp1[i]]) {
          dp2[i] = dp1[i];
          dp1[i] = dp1[j];
        } else if ((dp2[i] == -1 || a[dp1[j]] > a[dp2[i]]) &&
                   get(dp1[j]) != get(dp1[i])) {
          dp2[i] = dp1[j];
        }
        if ((dp2[i] == -1 || a[dp2[j]] > a[dp2[i]]) &&
            get(dp2[j]) != get(dp1[i])) {
          dp2[i] = dp2[j];
        }
      }
}
long long ans;
pair<int, int> pt[maxn];
void Boruvka() {
  for (int i = 0; i <= n; i++) ga[i] = i;
  for (int tot = n + 1; tot > 1;) {
    sos();
    for (int i = 0; i <= n; i++) pt[i] = make_pair(-1, -1);
    for (int i = 0; i <= n; i++) {
      int ii = a[i] ^ A;
      if (dp1[ii] > -1 && get(i) != get(dp1[ii])) {
        pt[get(i)] = max(pt[get(i)], make_pair(a[i] + a[dp1[ii]], dp1[ii]));
      } else if (dp2[ii] > -1 && get(i) != get(dp2[ii])) {
        pt[get(i)] = max(pt[get(i)], make_pair(a[i] + a[dp2[ii]], dp2[ii]));
      }
    }
    for (int i = 0; i <= n; i++)
      if (ga[i] == i && pt[i].first > -1 && get(i) != get(pt[i].second)) {
        ans += pt[i].first;
        ga[get(i)] = get(pt[i].second);
        tot--;
      }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    ans -= a[i];
  }
  Boruvka();
  printf("%lld\n", ans);
}