func_code_string: #include <bits/stdc++.h>   using namespace std;   long long ans = 0;   int a[200005], n, len = 1 << 18;   int mx1[1 << 18], mx2[1 << 18], fa[200005], w1[200005], w2[200005];   int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }   void add(int x, int w) {     if (find(w) != find(mx1[x]) && a[w] > a[mx1[x]])       mx2[x] = mx1[x], mx1[x] = w;     else if (find(w) != find(mx1[x]) && a[w] > a[mx2[x]])       mx2[x] = w;   }   int query(int x) {     int t = (len - 1) ^ a[x];     if (mx1[t] && find(mx1[t]) != find(x)) return mx1[t];     if (mx2[t] && find(mx2[t]) != find(x)) return mx2[t];     return 0;   }   int merge(int x, int y) {     if (y == 0) return 0;     y = find(y);     if (x == y) return 0;     fa[x] = y;     return 1;   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; ++i) scanf( %d , &a[i]), ans -= a[i];     ++n;     a[0] = -1;     for (int i = 1; i <= n; ++i) fa[i] = i;     while (1) {       for (int i = 0; i < len; ++i) mx1[i] = mx2[i] = 0;       for (int i = 1; i <= n; ++i) add(a[i], i);       for (int i = 0; i < 18; ++i)         for (int j = 0; j < len; ++j)           if (j & (1 << i)) {             add(j, mx1[j ^ (1 << i)]);             add(j, mx2[j ^ (1 << i)]);           }       for (int i = 1; i <= n; ++i) w1[i] = -1;       for (int i = 1; i <= n; ++i) {         int t = query(i), x = find(i);         if (t != 0 && a[i] + a[t] > w1[x]) w1[x] = a[i] + a[t], w2[x] = t;       }       int f = 0;       for (int i = 1; i <= n; ++i)         if (find(i) == i && merge(i, w2[i])) ans += w1[i], f = 1;       if (!f) break;     }     printf( %lld , ans);   }   