Submission #1146509

#TimeUsernameProblemLanguageResultExecution timeMemory
1146509Alihan_8XOR Sum (info1cup17_xorsum)C++20
100 / 100
761 ms45200 KiB
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n; cin >> n;
	
	vector <int> a(n);
	
	for ( auto &u: a ) cin >> u;
	
	int ans = 0;
	
	for ( int b = 0; b < 30; b++ ){
		array <int,2> cnt = {0, 0};
		
		vector <int> q;
		
		for ( auto &u: a ){
			q.push_back(u % (1 << b));
				
			cnt[u >> b & 1] ^= 1;
		}
		
		int x = cnt[0] * cnt[1];
		
		if ( b <= 23 ){
			int k = 1 << b;
			
			vector <int> pf(k + 1);
			
			for ( auto &u: q ) pf[u] += 1;
			
			for ( int i = 1; i <= k; i++ ) pf[i] += pf[i - 1];
			
			i64 tot = 0, z = 0;
			
			for ( auto &u: q ){
				int v = pf[k] - pf[k - u - 1];
				
				if ( u * 2 >= k ) z++;
				
				tot += v;
			} 
			
			tot = (tot - z) / 2 + z;
			
			x ^= tot & 1;
		} else{
			sort(q.begin(), q.end());
			
			int m = q.size(), j = m;
			
			for ( int i = 0; i < m; i++ ){
				while ( j - 1 >= 0 && q[j - 1] + q[i] >= (1 << b) ) --j;
				
				x ^= (m - max(i, j)) & 1;
			}
		}
		
		ans |= x << b;
	}
	
	cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...