//update : làm người bình thường
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#ifdef _OPENMP
#include <omp.h>
#endif
#if LOCAL
#include <algo/debug.h>
#endif
using namespace std;
using ll = long long;
const int MOD = 1e9 + 7;
const int LIMIT = 1e6 + 7;
const ll INF = LLONG_MAX;
vector<ll> sieve(int lim) {
vector<bool> isprime(lim + 1, true);
isprime[0] = isprime[1] = false;
for (int i = 2; i * i <= lim; ++i) {
if (isprime[i])
for (int j = i * i; j <= lim; j += i)
isprime[j] = false;
}
vector<ll> primes;
primes.reserve((size_t)(lim / log(lim)));
for (int i = 2; i <= lim; ++i) {
if (isprime[i])
primes.push_back(i);
}
return primes;
}
vector<ll> get(int m, const vector<ll>& primes) {
int sz = primes.size();
int imax = sz;
for (int i = 0; i < sz - 1; ++i) {
if (primes[i] * primes[i + 1] > m) {
imax = i;
break;
}
}
size_t totalcount = 0;
for (int i = 0; i < imax; ++i) {
ll limit_i = m / primes[i];
auto it = upper_bound(primes.begin() + i + 1, primes.end(), limit_i);
totalcount += (it - (primes.begin() + i + 1));
}
vector<ll> semi;
semi.reserve(totalcount);
int numthreads = 1;
vector<vector<ll>> localres(numthreads);
for (int i = 0; i < numthreads; i++) {
localres[i].reserve(totalcount / numthreads + 100);
}
for (int i = 0; i < imax; ++i) {
int tid = 0;
ll limit_i = m / primes[i];
auto startit = primes.begin() + i + 1;
auto endit = upper_bound(startit, primes.end(), limit_i);
int cnt = endit - startit;
if (cnt <= 0) continue;
vector<ll> temp(cnt);
#pragma omp simd
for (int k = 0; k < cnt; k++) {
temp[k] = primes[i] * (*(startit + k));
}
localres[tid].insert(localres[tid].end(), temp.begin(), temp.end());
}
for (int i = 0; i < numthreads; i++) {
semi.insert(semi.end(), localres[i].begin(), localres[i].end());
}
sort(semi.begin(), semi.end());
return semi;
}
inline ll solve(const vector<ll>& semi, int tar) {
const ll* first = semi.data();
const ll* last = first + semi.size();
const ll* res = std::upper_bound(first, last, tar);
if (res == first) return -1;
return *(res - 1);
}
signed main() {
cin.tie(nullptr), cout.tie(nullptr)->ios_base::sync_with_stdio(false);
#define task "sol"
if (fopen(task ".inp", "r")) {
freopen(task ".inp", "r", stdin), freopen(task ".out", "w", stdout);
}
int t;
cin >> t;
vector<int> query(t);
int lim = 0;
for (int i = 0; i < t; ++i) {
cin >> query[i];
lim = max(lim, query[i]);
}
vector<ll> primes = sieve(lim);
vector<ll> semi = get(lim, primes);
for (int tar : query) {
cout << solve(semi, tar) << "\n";
}
return 0;
}