func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 3e5 + 10, M = (1 << 18);   int n, a[N], fa[N], cnt;   long long ans;   pair<int, int> mx[M][2], cur[M];   int getfa(int x) { return fa[x] == x ? x : fa[x] = getfa(fa[x]); }   bool merge(int x, int y) {     x = getfa(x), y = getfa(y);     if (x == y) return 0;     fa[x] = y;     return 1;   }   int main() {     cin >> n;     for (int i = 1; i <= n; i++) {       scanf( %d , &a[i]), fa[i] = i;       ans -= a[i];     }     cnt = n + 1;     while (cnt > 1) {       for (int i = 0; i <= M - 1; i++)         for (int j = 0; j <= 1; j++) mx[i][j] = make_pair(-1, -1);       for (int i = 0; i <= n; i++) {         pair<int, int> t = make_pair(a[i], getfa(i));         if (mx[a[i]][0] < t) {           if (mx[a[i]][0].second != t.second) mx[a[i]][1] = mx[a[i]][0];           mx[a[i]][0] = t;         } else if (mx[a[i]][1] < t) {           if (mx[a[i]][0].second != t.second) mx[a[i]][1] = t;         }       }       for (int i = 0; i <= M - 1; i++) {         for (int j = 0; j <= 18; j++) {           if (i & (1 << j)) {             for (int k = 0; k <= 1; k++) {               if (mx[i][0] < mx[i ^ (1 << j)][k]) {                 if (mx[i][0].second != mx[i ^ (1 << j)][k].second)                   mx[i][1] = mx[i][0];                 mx[i][0] = mx[i ^ (1 << j)][k];               } else if (mx[i][1] < mx[i ^ (1 << j)][k]) {                 if (mx[i][0].second != mx[i ^ (1 << j)][k].second)                   mx[i][1] = mx[i ^ (1 << j)][k];               }             }           }         }       }       for (int i = 0; i <= n; i++) cur[i] = make_pair(-1, -1);       for (int i = 0; i <= n; i++) {         int f = getfa(i);         int t = ((M - 1) ^ a[i]);         if (mx[t][0].second != -1 && mx[t][0].second != f) {           cur[f] = max(cur[f], make_pair(mx[t][0].first + a[i], mx[t][0].second));         } else if (mx[t][1].second != -1 && mx[t][1].second != f) {           cur[f] = max(cur[f], make_pair(mx[t][1].first + a[i], mx[t][1].second));         }       }       for (int i = 0; i <= n; i++) {         if (fa[i] == i && merge(i, cur[i].second)) {           cnt--, ans += cur[i].first;         }       }     }     printf( %lld n , ans);     return 0;   }   