#include <bits/stdc++.h>
using namespace std;
using ULL = unsigned long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
int n; cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
vector<int> vals = a;
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
for (int i = 0; i < n; ++i)
a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin();
int M = (int)vals.size();
int W = (M + 63) / 64;
vector<int> maxEnd(n, -1);
vector<vector<int>> seqAt(n);
vector<ULL> prefMasksAt_flat;
vector<int> prefOffset(n+1,0);
prefOffset[0] = 0;
for (int s = 0; s < n; ++s) {
vector<ULL> cur(W, 0ULL);
vector<int> seq;
vector<ULL> store;
vector<char> seen(M, 0);
for (int j = s; j < n; ++j) {
int c = a[j];
if (seen[c]) break;
seen[c] = 1;
seq.push_back(c);
int idx = c >> 6;
int bit = c & 63;
cur[idx] |= (1ULL << bit);
for (int t = 0; t < W; ++t) store.push_back(cur[t]);
}
seqAt[s] = move(seq);
prefOffset[s+1] = prefOffset[s] + (int)store.size();
for (auto &v : store) prefMasksAt_flat.push_back(v);
maxEnd[s] = s + (int)seqAt[s].size() - 1;
}
auto get_pref_mask_ptr = [&](int s, int prefix_idx)->ULL* {
if (prefix_idx < 0) return nullptr;
int off = prefOffset[s] + prefix_idx * W;
return &prefMasksAt_flat[off];
};
vector<vector<int>> seqEndAt(n);
for (int r = 0; r < n; ++r) {
vector<char> seen(M, 0);
vector<int> seq;
for (int j = r; j >= 0; --j) {
int c = a[j];
if (seen[c]) break;
seen[c] = 1;
seq.push_back(c);
}
seqEndAt[r] = move(seq);
}
int ans = 0;
vector<int> lenStart(n);
for (int s = 0; s < n; ++s) lenStart[s] = (int)seqAt[s].size();
vector<int> suffixMaxStartLen(n+1, 0);
for (int i = n-1; i >= 0; --i) suffixMaxStartLen[i] = max(suffixMaxStartLen[i+1], lenStart[i]);
vector<ULL> maskL(W);
for (int r = 0; r < n; ++r) {
fill(maskL.begin(), maskL.end(), 0ULL);
int maxT = (int)seqEndAt[r].size();
for (int t = 1; t <= maxT; ++t) {
int c = seqEndAt[r][t-1];
maskL[c >> 6] |= (1ULL << (c & 63));
int leftLen = t;
int l = r - (t - 1);
int ub = leftLen + suffixMaxStartLen[r+1];
if (ub <= ans) continue;
for (int s = r+1; s < n; ++s) {
int maxPref = lenStart[s];
if (maxPref == 0) continue;
if (leftLen + maxPref <= ans) continue;
int lo = 0, hi = maxPref - 1, best = -1;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
ULL *pm = get_pref_mask_ptr(s, mid);
bool ok = true;
for (int w = 0; w < W; ++w) {
if ((pm[w] & maskL[w]) != 0ULL) { ok = false; break; }
}
if (ok) { best = mid; lo = mid + 1; }
else hi = mid - 1;
}
if (best >= 0) {
int rightLen = best + 1;
ans = max(ans, leftLen + rightLen);
}
}
}
}
cout << ans << '\n';
}
return 0;
}