Problem p02626 (C++) — buggy submission, verdict: Time Limit Exceeded

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")

// #include <x86intrin.h>
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
// #include <ordered_set>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>

// using namespace __gnu_pbds;
using namespace std;

// template<typename T> using ordered_set = tree <T, null_type, less<T>,
// rb_tree_tag, tree_order_statistics_node_update>;

#define F first
#define S second
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pf push_front
#define ppb pop_back
#define mp make_pair
#define bpp __builtin_popcountll
#define sqr(x) ((x) * (x))
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define in insert
#define ppf pop_front
#define endl '\\n'
#define int long long

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int mod = (int)1e9 + 7;
const int N = (int)3e5 + 123;
const ll inf = (ll)1e18 + 1;

const double pi = acos(-1.0);
const double eps = 1e-9;
const int dx[] = {0, 0, 1, 0, -1};
const int dy[] = {0, 1, 0, -1, 0};

int n;
ll x, a[N], S;

inline void boost() { //(a[1]-T)^(a[2]+T) != x
  ios_base ::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
}

inline void Solve() {
  cin >> n;
  // a+b=2*(a&b)+(a^b)
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (i >= 3)
      x ^= a[i]; //(a&b)=D,(a^b)=X
    else
      S += a[i];
  }
  if ((S - x) & 1)
    cout << -1, exit(0);
  ll D = (S - x) / 2;
  if (D < 0)
    cout << -1, exit(0);
  ll c = 0, d = 0;
  for (int i = 60; i >= 0; i--) {
    if (D & (1ll << i)) {
      c += (1ll << i);
      d += (1ll << i);
      if (x & (1ll << i))
        cout << -1, exit(0);
    }
  }
  if (c > a[1])
    cout << -1, exit(0);
  for (int i = 60; i >= 0; i--) {
    if (D & (1ll << i))
      continue;
    if (x & (1ll << i)) {
      if (c + (1ll << i) <= a[1])
        c += (1ll << i);
      else
        d += (1ll << i);
    }
  }
  if ((c & d) != D || (c ^ d) != x || c == 0)
    cout << -1, exit(0);
  cout << a[1] - c;
}

signed main() {
#ifdef QWERTY
  freopen("input", "r", stdin);
#endif
  // freopen (".in", "r", stdin);
  // freopen (".out", "w", stdout);
  boost();
  int tt = 1;
  // cin >> tt;
  while (tt--) {
    Solve();
  }
  return 0;
}

Error: TLE

Fixed submission:

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")

// #include <x86intrin.h>
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
// #include <ordered_set>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>

// using namespace __gnu_pbds;
using namespace std;

// template<typename T> using ordered_set = tree <T, null_type, less<T>,
// rb_tree_tag, tree_order_statistics_node_update>;

#define F first
#define S second
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pf push_front
#define ppb pop_back
#define mp make_pair
#define bpp __builtin_popcountll
#define sqr(x) ((x) * (x))
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define in insert
#define ppf pop_front
#define endl '\\n'
// #define int long long

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int mod = (int)1e9 + 7;
const int N = (int)3e5 + 123;
const ll inf = (ll)1e18 + 1;

const double pi = acos(-1.0);
const double eps = 1e-9;
const int dx[] = {0, 0, 1, 0, -1};
const int dy[] = {0, 1, 0, -1, 0};

int n;
ll x, a[N];

inline void boost() { //(a[1]-T)^(a[2]+T) != x
  ios_base ::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
}

inline void Solve() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (i >= 3)
      x ^= a[i];
  }
  for (int i = 0; i < min(100000000ll, a[1]); i++) {
    if (((a[1] - i) ^ (a[2] + i)) == x)
      cout << i, exit(0);
  }
  for (int i = min(0ll, a[1] - 100000000ll); i < a[1]; i++) {
    if (((a[1] - i) ^ (a[2] + i)) == x)
      cout << i, exit(0);
  }
  cout << -1;
}

signed main() {
  // #ifdef QWERTY
  //    freopen("input", "r", stdin);
  // #endif
  // freopen (".in", "r", stdin);
  // freopen (".out", "w", stdout);
  boost();
  int tt = 1;
  // cin >> tt;
  while (tt--) {
    Solve();
  }
  return 0;
}