#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll n, arr[1000005], newarr[1000005];
ll res = 0;
vector<pair<ll, int>> cvec;
void updbuc(int k) {
//update 2^k into cvec
//currently cvec is sorted according to 2^0, 2^1, ..., 2^n
vector<pair<ll, int>> vec1, vec2;
for(auto &e:cvec) {
if(arr[e.second] & (1ll << k)) vec2.emplace_back(e);
else vec1.emplace_back(e);
}
cvec = vec1;
for(auto &e:vec2) {
e.first ^= (1 << k);
cvec.emplace_back(e);
}
}
int main() {
cin.tie(0) -> sync_with_stdio(0);
cin >> n;
for(int i=0;i<n;i++) {
cin >> arr[i];
newarr[i] = arr[i];
cvec.emplace_back(0, i);
}
for(int k=0;k<32;k++) {
int cres = 0;
int odc = 0, evc = 0;
for(int i=0;i<n;i++) {
if(newarr[i] & 1) odc++;
else evc++;
}
cres = (odc & 1) * (evc & 1);
if(k) {
long long cnt = 0;
updbuc(k-1);
for(int i=0;i<n;i++) {
if(((arr[i] & ((1ll << k) - 1)) << 1) >= (1ll << k)) cnt++;
}
int clow = n;
for(int i=0;i<n;i++) {
while(clow) {
if(cvec[clow-1].first >= ((1ll << k) - cvec[i].first)) clow--;
else break;
}
cnt += (n-clow);
}
//cout << cnt << '\n';
cnt = ((cnt >> 1) & 1);
cres ^= cnt;
}
if(cres) res ^= (1ll << k);
for(int i=0;i<n;i++) newarr[i] >>= 1;
}
cout << res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |