#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> // using mint = modint998244353; template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint998244353; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } ll floor_sqrt(ll X) { // 平方根の整数切り捨て。 ll left = 0; ll right = 3000000003; while (true) { if (right - left <= 1) { break; } ll center = (left + right) / 2; if (center * center > X) { right = center; } else { left = center; } } return left; } int main() { ll T; cin >> T; while (T--) { ll N; cin >> N; ll ans = -1; if (N < (1LL << 16)) { for (ll k = 0; k < (1LL << 16); k++) { ll fk = floor_sqrt(k); if ((fk ^ k) == N) { ans = k; break; } } } else { ll bitlen = 0; for (ll i = 0; i < 60; i++) { if ((N >> i) & 1) { bitlen = i; } } ll line = (bitlen + 2) / 2; ll mask1 = (1LL << line) - 1; // k の値として考えられる範囲はここに限られる ll lower = ((N >> line) << line); ll upper = N | mask1; // debug_out(lower, upper); ll fk_lower = floor_sqrt(lower); ll fk_upper = floor_sqrt(upper); // debug_out(fk_lower, fk_upper); for (ll i = fk_lower; i <= fk_upper; i++) { ll k = (i ^ N); if (i * i <= k && k < (i + 1) * (i + 1)) { ans = k; break; } } } cout << ans << endl; } }