using i64 = long long;
using i128 = __int128;
using u32 = unsigned;
using u64 = unsigned long long;
using f32 = double;
using f64 = long double;
#define uset unordered_set
#define umap unordered_map
#define vi vector<int>
#define vvi vector<vi>
#define vll vector<i64>
#define vvll vector<vll>
#define pii pair<int, int>
#define pll pair<i64, i64>
#define vpii vector<pii>
#define vpll vector<pll>
#define vvpii vector<vpii>
#define vvpll vector<vpll>
#define vz vector<Z>
#define vvz vector<vz>
#define pb push_back
#define pq priority_queue
#define ALL(x) (x).begin(), (x).end()
#define rep(i, x, y) for (int (i) = (x); (i) < (y); (i)++)
#define repr(i, x, y) for (int (i) = (x); (i) > (y); (i)--)
#define YES "YES\n"
#define NO "NO\n"
#define SZ(x) (static_cast<int>(x.size()))
#include <bits/stdc++.h>
using namespace std;
mt19937_64 rng((unsigned) chrono::high_resolution_clock::now().time_since_epoch().count());
const int MAX = 1000010;
vi f(MAX), g(MAX);
void init() {
iota(ALL(f), 0);
rep(i, 2, MAX) if (f[i] == i) for (int j = i + i; j < MAX; j += i) f[j] = min(f[j], i);
auto get = [&](int n) {
umap<int, int> cnt;
while (n > 1) {
cnt[f[n]]++;
n /= f[n];
}
return cnt;
};
int prev = 0;
rep(i, 1, MAX) {
g[i] = g[i - 1];
if (i & 1) {
auto f1 = get((i + 1) / 2);
auto f2 = get(i);
for (auto &[p, c] : f2) f1[p] += c;
int ans = 1;
for (auto &[p, c] : f1) ans *= c + 1;
if (ans > prev) {
prev = ans;
g[i] = ans;
}
} else {
auto f1 = get(i / 2);
auto f2 = get(i + 1);
for (auto &[p, c] : f2) f1[p] += c;
int ans = 1;
for (auto &[p, c] : f1) ans *= c + 1;
if (ans > prev) {
prev = ans;
g[i] = ans;
}
}
}
}
void solve() {
int n;
cin >> n;
cout << g[n] << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
init();
int t;
cin >> t;
while (t--) solve();
}