Problem:
Score : 600 points

Problem Statement

There are N piles of stones. The i-th pile has A_i stones.

Aoki and Takahashi are about to use them to play the following game:

Starting with Aoki, the two players alternately do the following operation:

Operation: Choose one pile of stones, and remove one or more stones from it.

When a player is unable to do the operation, he loses, and the other player wins.

When the two players play optimally, there are two possibilities in this game: the player who moves first always wins, or the player who moves second always wins, only depending on the initial number of stones in each pile.

In such a situation, Takahashi, the second player to act, is trying to guarantee his win by moving at least zero and at most (A_1 - 1) stones from the 1-st pile to the 2-nd pile before the game begins.

If this is possible, print the minimum number of stones to move to guarantee his victory; otherwise, print -1 instead.

Constraints

2 \leq N \leq 300

1 \leq A_i \leq 10^{12}

Input

Input is given from Standard Input in the following format:

N
A_1 \ldots A_N

Output

Print the minimum number of stones to move to guarantee Takahashi's win; otherwise, print -1 instead.

Sample Input 1

2
5 3

Sample Output 1

1

Without moving stones, if Aoki first removes 2 stones from the 1-st pile, Takahashi cannot win in any way.

If Takahashi moves 1 stone from the 1-st pile to the 2-nd before the game begins so that both piles have 4 stones, Takahashi can always win by properly choosing his actions.

Sample Input 2

2
3 5

Sample Output 2

-1

It is not allowed to move stones from the 2-nd pile to the 1-st.

Sample Input 3

3
1 1 2

Sample Output 3

-1

It is not allowed to move all stones from the 1-st pile.

Sample Input 4

8
10 9 8 7 6 5 4 3

Sample Output 4

3

Sample Input 5

3
4294967297 8589934593 12884901890

Sample Output 5

1

Watch out for overflows.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using  namespace std;

#define endl '\n'
#define ll long long
#define rint register int
#define minpq priority_queue <int, vector<int>, greater<int> >
#define maxpq  priority_queue <int>

#define re register
#define pb(x) push_back(x);
#define ce(x) cout << x << '\n';

using db = long double;
using pll = pair < ll, ll >;
#define scan(a, n) 		for(int i = 0; i < n; i++)cin >> a[i];

#define rep(i,x,n,inc) for(i=x ; i<n ; i+=inc)
#define repr(i,x,n,inc) for( i=x ; i>n ; i+=inc)
#define all(a)      (a).begin(),(a).end()
#define unique_sort(x) sort(all(x)), x.resize(distance(x.begin(), unique(all(x))))

#define mp(a,b) make_pair(a,b)
#define ff first
#define ss second
#define hell 1000000007
#define infl LLONG_MAX

#define Foxen(i,s) for (i=s.begin(); i!=s.end(); i++)
#define Fill(s,v) memset(s,v,sizeof(s))
#define cout_p(x, p) cout << fixed << setprecision((p)) << x << endl     //print with precision

#define tc(tt) \
    ll tt;    \
    cin >> tt; \
    for (ll _tt = 0; _tt < tt; _tt++) // testcase 

int32_t main() {
	ios::sync_with_stdio(0); 		cin.tie(0); cout.tie(0);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	ll t, i, x, j, y, 	z = 0, k, n;
	cin >> n;
	ll a[n];
	rep(i, 0, n, 1) {
		cin >> a[i];
		if (i >= 2)	z ^= a[i];
	}
	if (z == (a[0]^a[1]))	return cout << 0, 0;
	// ce(z)
	k = 40;
	t = 0;
	ll ans = 0;
	x = a[0], y = a[1];

	// z = z * 1;
	k = 39;

	// rep(i, 0, 39, 1)	k *= 2;

	// rep(i, 0, min(x - 1, 1LL << 25), 1) {
	// 	ll newX = x - i, newY = y + i;
	// 	if ((newY ^ newX ) == z) return cout << i, 0;
	// }

	// return cout << "-1", 0;


	if (z == 0) {
		if (x >= y && (x + y) % 2 == 0) {
			z = (x - y) / 2;
			return cout << z, 0;
		}
		return cout << "-1", 0;
	}

	while (k >= 0) {
		j = (1LL << k);
		// ce(" " << k << " " << j)
		if ((z & j) ) {
			// ce(k << " " << " has " << j)

			if ((x & j) && (y & j)) {
				if (t)	return  cout << "-1", 0;
				// if (t)	return  cout << "-1 0", 0;
				t = 1;
			}
			else if (!(x & j) && !(y & j)) {
				if ((y & (j) / 2) && (x & (j) / 2))	{
					ans += j / 2;
					x -= j / 2;
					y += j / 2;
				}
				else {
					return  cout << "-1", 0;

					// return  cout << "-1 1", 0;
				}
			}
			else {
				if (t)	return  cout << "-1", 0;
				// if (t)	return  cout << "-1 2", 0;
			}
		}
		else {
			// ce(k << "z don't" << j)

			if ((x & j) && (y & j)) {
				if (t)	return cout << "-1", 0;
				// if (t)	return cout << "-1 3", 0;
			}
			else if (!(x & j) && !(y & j)) {
				if (t)	{
					ans += 1 << (k);
					t = 0;
				}
			}
			else {
				if (t)	return cout << "-1", 0;
				// if (t)	return cout << "-1 4", 0;


				if (!(x & j) && (y & j)) {
					return cout << "-1", 0;
					// return cout << "-1 5", 0;
				} else {
					t = 1;
				}
			}
		}
		// k /= 2;
		k--;
	}

	// ce(ans)
	if (ans >= a[0] or ((a[0] - ans) ^ (a[1] + ans)) != z)	ans = -1;
	cout << ans;
}