#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
//#include <queue>
//#include <numeric>
#include <cassert>
using namespace std;
#ifdef LOCAL_DEBUG
#include <local_debug.h>
#define DEBUG(...) DBG2::cprint(#__VA_ARGS__, __LINE__, __VA_ARGS__)
#else
#define DEBUG(...)
#endif
#define SZ(a) int((a).size())
#define REP(i,n) for(int i=0,_n=(n);i<_n;++i)
#define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;++i)
using llong = long long;
using VI = vector<int>;
using VVI = vector<VI>;
using II = pair<int,int>;
const int MAXN = 1000000;
const int MAXP = MAXN+1;
int lp[MAXP+1];
vector<int> primes;
void sieve() {
for (int i = 2; i <= MAXP; ++i) {
if (lp[i] == 0) {
lp[i] = i;
primes.push_back(i);
}
for (int p : primes) {
if (p > lp[i] || i * p > MAXP) break;
lp[i * p] = p;
}
}
}
vector<II> factorize(int n) {
vector<II> res;
while (n > 1) {
int p = lp[n];
if (res.empty() || res.back().first != p)
res.push_back(II(p, 1));
else
res.back().second++;
n /= p;
}
return res;
}
int main(int argc, char* argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
sieve();
vector< vector<II> > prime_factors(MAXP+1);
FOR(x, 2, MAXP)
prime_factors[x] = factorize(x);
auto get_num_divisors = [&](int x, int y) -> int {
int res = 1;
const vector<II>& pfx = prime_factors[x];
const vector<II>& pfy = prime_factors[y];
int i = 0, j = 0;
while (i < SZ(pfx) and j < SZ(pfy)) {
if (pfx[i].first == pfy[i].first) {
res *= pfx[i].second + pfy[i].second + 1;
++i, ++j;
}
else if (pfx[i].first == pfy[i].first) {
res *= pfx[i].second + 1;
++i;
}
else {
res *= pfy[j].second + 1;
++j;
}
}
for (; i < SZ(pfx); i++)
res *= pfx[i].second + 1;
for (; j < SZ(pfy); j++)
res *= pfy[j].second + 1;
return res;
};
vector<int> T(MAXN+1);
T[1] = 1;
FOR(k, 2, MAXN) {
// S = k*(k+1) / 2
if ((k % 2) == 0) {
T[k] = get_num_divisors(k/2, k+1);
}
else {
T[k] = get_num_divisors(k, (k+1)/2);
}
}
FOR(k, 2, MAXN)
T[k] = max(T[k], T[k-1]);
int TC;
cin >> TC;
FOR(tc, 1, TC) {
int N;
cin >> N;
cout << T[N] << '\n';
}
return 0;
}