Problem p02626 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
template <class T> ostream &operator<<(ostream &os, vector<T> V) {
  os << "[ ";
  for (auto v : V)
    os << v << " ";
  return os << "]";
}
template <class T> ostream &operator<<(ostream &os, set<T> S) {
  os << "{ ";
  for (auto s : S)
    os << s << " ";
  return os << "}";
}
template <class L, class R> ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class L, class R> ostream &operator<<(ostream &os, map<L, R> M) {
  os << "{ ";
  for (auto m : M)
    os << "(" << m.F << ":" << m.S << ")";
  return os << "}";
}
#define cerr cout
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
#else
#define trace(...) 1
#endif
#define ll long long
#define ld long double
#define vll vector<ll>
#define pll pair<ll, ll>
#define vpll vector<pll>
#define I insert
#define pb push_back
#define F first
#define S second
#define endl "\n"
#define mp make_pair
#define all(v) (v).begin(), (v).end()
#define For(i, n) for (int i = 0; i < (int)n; ++i)
#define Rev(i, n) for (int i = (int)n - 1; i >= 0; --i)
#define Rep(i, n) for (int i = 1; i <= (int)n; ++i)
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef pair<pii, int> ppi;
typedef vector<pii> vpii;
#define fio                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL)

const int N = 500;

ll A[N];
ll B[N];

int main() {
  fio;
  cout << fixed << setprecision(25);
  ll xr = 0;
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> A[i];
    if (i > 2)
      xr ^= A[i];
  }

  if ((xr ^ A[1] ^ A[2]) == 0) {
    cout << 0 << endl;
    return 0;
  }
  if (A[1] == 1) {
    cout << -1 << endl;
    return 0;
  }
  ll sum = A[1] + A[2];
  // trace(sum , xr);
  if (sum < xr || (((sum - xr) % 2) != 0)) {
    cout << -1 << endl;
  } else {
    ll ed = (sum - xr) / 2;
    ll fir = ed;
    // trace(ed , xr);
    // B[0] += (ed&1);
    // for(int i = 1;i < 50 ; ++i){
    // 	B[i] += B[i-1];
    // 	if((1ll<<i)&ed)
    // 		B[i] += (1ll<<i);
    // }
    // trace(ed);

    // trace(B[49]);
    if (ed > A[1]) {
      cout << -1 << endl;
      return 0;
    }
    for (int i = 49; i >= 0; --i) {
      if ((ed & (1ll << i))) {
        assert((xr & (1ll << i)) == 0);
        // trace(i);
        // fir += (1ll<<i);
      } else if (xr & (1ll << i)) {
        ll fin = fir + (1ll << i);
        // trace(B[i]);
        if (fin <= A[1]) {
          // trace(i);
          fir += (1ll << i);
        }
      }
    }
    // assert(fir <= A[1]);
    // trace(fir);
    if (fir <= A[1] && (fir != 0)) {
      // assert(fir != A[1]);
      cout << A[1] - fir << endl;
    } else {
      cout << -1 << endl;
    }
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
template <class T> ostream &operator<<(ostream &os, vector<T> V) {
  os << "[ ";
  for (auto v : V)
    os << v << " ";
  return os << "]";
}
template <class T> ostream &operator<<(ostream &os, set<T> S) {
  os << "{ ";
  for (auto s : S)
    os << s << " ";
  return os << "}";
}
template <class L, class R> ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class L, class R> ostream &operator<<(ostream &os, map<L, R> M) {
  os << "{ ";
  for (auto m : M)
    os << "(" << m.F << ":" << m.S << ")";
  return os << "}";
}
#define cerr cout
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
#else
#define trace(...) 1
#endif
#define ll long long
#define ld long double
#define vll vector<ll>
#define pll pair<ll, ll>
#define vpll vector<pll>
#define I insert
#define pb push_back
#define F first
#define S second
#define endl "\n"
#define mp make_pair
#define all(v) (v).begin(), (v).end()
#define For(i, n) for (int i = 0; i < (int)n; ++i)
#define Rev(i, n) for (int i = (int)n - 1; i >= 0; --i)
#define Rep(i, n) for (int i = 1; i <= (int)n; ++i)
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef pair<pii, int> ppi;
typedef vector<pii> vpii;
#define fio                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL)

const int N = 500;

ll A[N];
ll B[N];

int main() {
  fio;
  cout << fixed << setprecision(25);
  ll xr = 0;
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> A[i];
    if (i > 2)
      xr ^= A[i];
  }

  if ((xr ^ A[1] ^ A[2]) == 0) {
    cout << 0 << endl;
    return 0;
  }
  if (A[1] == 1) {
    cout << -1 << endl;
    return 0;
  }
  ll sum = A[1] + A[2];
  // trace(sum , xr);
  if (sum < xr || (((sum - xr) % 2) != 0)) {
    cout << -1 << endl;
  } else {
    ll ed = (sum - xr) / 2;
    ll fir = ed;
    // trace(ed , xr);
    // B[0] += (ed&1);
    // for(int i = 1;i < 50 ; ++i){
    // 	B[i] += B[i-1];
    // 	if((1ll<<i)&ed)
    // 		B[i] += (1ll<<i);
    // }
    // trace(ed);

    // trace(B[49]);
    if (ed > A[1]) {
      cout << -1 << endl;
      return 0;
    }
    for (int i = 49; i >= 0; --i) {
      if ((ed & (1ll << i))) {
        if ((xr & (1ll << i)) != 0) {
          cout << -1 << endl;
          return 0;
        }
        // trace(i);
        // fir += (1ll<<i);
      } else if (xr & (1ll << i)) {
        ll fin = fir + (1ll << i);
        // trace(B[i]);
        if (fin <= A[1]) {
          // trace(i);
          fir += (1ll << i);
        }
      }
    }
    // assert(fir <= A[1]);
    // trace(fir);
    if (fir <= A[1] && (fir != 0)) {
      // assert(fir != A[1]);
      cout << A[1] - fir << endl;
    } else {
      cout << -1 << endl;
    }
  }

  return 0;
}