#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <iostream>
#include <set>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef vector<pii> vii;
typedef vector<string> vs;

void f(vi& dw, vi& up, vi& eq, const vi& a, int l2, int r2) {
    for (int it = l2; it <= r2; ++it) {
        eq[a[it]]++;
        int m1 = ((a[it] >> 7) << 7), m2 = a[it] % (1 << 7);
        for (int s = m2; s; s = (s - 1) & m2) {
            up[m1 | s]++;
        }
        up[m1]++;
        for (int s = m2; s < (1 << 7); s = (s + 1) | m2) {
            dw[m1 | s]++;
        }
    }
}

int main() {
    ll res = 0;
    freopen("score6.in", "r", stdin);
    freopen("score6.ans", "w", stdout);
    int n;
    scanf("%d", &n);
    vi a(n);
    vii ts(n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        ts[i] = pii(a[i], i);
    }
    sort(ts.begin(), ts.end());
    vi pr(n, -1), nx(n, n);
    for (int i = 0; i < n; ++i) {
        pr[i] = i - 1;
        nx[i] = i + 1;
    }
    vvi up(n), dw(n), eq(n);
    const int M = 100;
    for (pii p : ts) {
        int i = p.second;
        int l = pr[i] + 1, r = nx[i] - 1;
        int l1 = l, r1 = i, l2 = i, r2 = r;
        if (r2 - l2 < r1 - l1) {
            swap(l1, l2);
            swap(r1, r2);
        }
        int cnt = 0;
        if (r2 - l2 <= M) {
            for (int it = l1; it <= r1; ++it)
                for (int j = l2; j <= r2; ++j) {
                    if (min(a[it], a[j]) == (a[it] & a[j])) {
                        ++cnt;
                    }
                }
        } else {
            if (l2 == i)
                ++l2;
            for (int it = l1; it <= r1; ++it) {
                if (min(a[it], a[i]) == (a[it] & a[i]))
                    ++cnt;
                int m1 = (a[it] >> 7), m2 = a[it] % (1 << 7);
                for (int s = m1; s; s = (s - 1) & m1) {
                    cnt += dw[l2][(s << 7) | m2];
                }
                cnt += dw[l2][m2];
                for (int s = m1; s < (1 << 7); s = (s + 1) | m1) {
                    cnt += up[l2][(s << 7) | m2];
                }
                cnt -= eq[l2][a[it]];
            }
            if (l2 == i + 1)
                --l2;
        }
        res += cnt * (ll)a[i];
        if (r - l >= M) {
            if (l2 == i)
                ++l2;
            if (r2 == i)
                --r2;
            if (dw[l2].empty()) {
                dw[l2].resize(1 << 14);
                up[l2].resize(1 << 14);
                eq[l2].resize(1 << 14);
                f(dw[l2], up[l2], eq[l2], a, l2, r2);
            }
            f(dw[l2], up[l2], eq[l2], a, l1, r1);  // for big r1-l1 add
            if (l2 != l) {
                dw[l].swap(dw[l2]);
                up[l].swap(up[l2]);
                eq[l].swap(eq[l2]);
            }
        }
        if (pr[i] >= 0)
            nx[pr[i]] = nx[i];
        if (nx[i] < n)
            pr[nx[i]] = pr[i];
    }
    for (int i = 0; i < n; ++i) res -= a[i];
    printf("%lld\n", res);
    return 0;
}
