func_code_string: #include <bits/stdc++.h>   using namespace std;   const int M = 200002;   int val[M];   vector<int> vec[33];   set<int> st;   struct Nod {     int v;     int id;     bool operator<(const Nod &cmp) const {       if (v == cmp.v) return id < cmp.id;       return v > cmp.v;     }   } p[M];   int n;   void init() {     for (int i = 0; i < 32; i++) {       for (int j = 0; j < n; j++) {         if (val[j] & (1 << i)) {           vec[i].push_back(j);         }       }     }   }   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) {       scanf( %d , &val[i]);       p[i].v = val[i];       p[i].id = i;     }     sort(p, p + n);     init();     long long ans = 0;     for (int i = 0; i < n; i++) {       Nod u = p[i];       set<int>::iterator it = st.upper_bound(u.id);       int L, R;       if (it == st.end()) {         R = n - 1;       } else         R = *it - 1;       if (it == st.begin()) {         L = 0;       } else {         it--;         L = *it + 1;       }       int l = L, r = R;       for (int j = 0; j < 32; j++) {         if ((u.v & (1 << j)) == 0) {           int tl = upper_bound(vec[j].begin(), vec[j].end(), u.id) -                    vec[j].begin() - 1;           if (tl >= 0) l = max(l, vec[j][tl] + 1);           int tr =               upper_bound(vec[j].begin(), vec[j].end(), u.id) - vec[j].begin();           if (tr < vec[j].size()) r = min(r, vec[j][tr] - 1);         }       }       ans += 1ll * (u.id - l + 1) * (r - u.id + 1);       st.insert(u.id);     }     printf( %I64d n , 1ll * n * (n + 1) / 2 - ans);     return 0;   }   