#include <bits/stdc++.h>
using namespace std;
// Structure to store segments
struct Seg {
int l, r, w; // left, right, weight
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
// Store positions of each value
vector<vector<int>> pos(n + 1);
for (int i = 0; i < n; i++) pos[a[i]].push_back(i);
vector<Seg> segs;
// Construct segments
for (int v = 1; v <= n; v++) {
const auto& p = pos[v];
int sz = p.size();
for (int t = 0; t + v <= sz; t++) {
segs.push_back({p[t], p[t + v - 1], v});
}
}
if (segs.empty()) {
cout << 0 << "\n";
continue;
}
// Sort segments by ending index
sort(segs.begin(), segs.end(), [](const Seg &a, const Seg &b) {
return a.r < b.r;
});
int m = segs.size();
vector<int> ends(m), starts(m), w(m);
for (int i = 0; i < m; i++) {
starts[i] = segs[i].l;
ends[i] = segs[i].r;
w[i] = segs[i].w;
}
vector<int> dp(m + 1, 0);
for (int i = 1; i <= m; i++) {
// Find last segment that ends before current starts
int j = int(lower_bound(ends.begin(), ends.end(), starts[i - 1]) - ends.begin());
}
cout << dp[m] << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBTdHJ1Y3R1cmUgdG8gc3RvcmUgc2VnbWVudHMKc3RydWN0IFNlZyB7CiAgICBpbnQgbCwgciwgdzsgLy8gbGVmdCwgcmlnaHQsIHdlaWdodAp9OwoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCB0OwogICAgY2luID4+IHQ7CgogICAgd2hpbGUgKHQtLSkgewogICAgICAgIGludCBuOwogICAgICAgIGNpbiA+PiBuOwoKICAgICAgICB2ZWN0b3I8aW50PiBhKG4pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gYVtpXTsKCiAgICAgICAgLy8gU3RvcmUgcG9zaXRpb25zIG9mIGVhY2ggdmFsdWUKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHBvcyhuICsgMSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHBvc1thW2ldXS5wdXNoX2JhY2soaSk7CgogICAgICAgIHZlY3RvcjxTZWc+IHNlZ3M7CgogICAgICAgIC8vIENvbnN0cnVjdCBzZWdtZW50cwogICAgICAgIGZvciAoaW50IHYgPSAxOyB2IDw9IG47IHYrKykgewogICAgICAgICAgICBjb25zdCBhdXRvJiBwID0gcG9zW3ZdOwogICAgICAgICAgICBpbnQgc3ogPSBwLnNpemUoKTsKICAgICAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgKyB2IDw9IHN6OyB0KyspIHsKICAgICAgICAgICAgICAgIHNlZ3MucHVzaF9iYWNrKHtwW3RdLCBwW3QgKyB2IC0gMV0sIHZ9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNlZ3MuZW1wdHkoKSkgewogICAgICAgICAgICBjb3V0IDw8IDAgPDwgIlxuIjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBTb3J0IHNlZ21lbnRzIGJ5IGVuZGluZyBpbmRleAogICAgICAgIHNvcnQoc2Vncy5iZWdpbigpLCBzZWdzLmVuZCgpLCBbXShjb25zdCBTZWcgJmEsIGNvbnN0IFNlZyAmYikgewogICAgICAgICAgICByZXR1cm4gYS5yIDwgYi5yOwogICAgICAgIH0pOwoKICAgICAgICBpbnQgbSA9IHNlZ3Muc2l6ZSgpOwogICAgICAgIHZlY3RvcjxpbnQ+IGVuZHMobSksIHN0YXJ0cyhtKSwgdyhtKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgICAgICBzdGFydHNbaV0gPSBzZWdzW2ldLmw7CiAgICAgICAgICAgIGVuZHNbaV0gPSBzZWdzW2ldLnI7CiAgICAgICAgICAgIHdbaV0gPSBzZWdzW2ldLnc7CiAgICAgICAgfQoKICAgICAgICB2ZWN0b3I8aW50PiBkcChtICsgMSwgMCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKSB7CiAgICAgICAgICAgIC8vIEZpbmQgbGFzdCBzZWdtZW50IHRoYXQgZW5kcyBiZWZvcmUgY3VycmVudCBzdGFydHMKICAgICAgICAgICAgaW50IGogPSBpbnQobG93ZXJfYm91bmQoZW5kcy5iZWdpbigpLCBlbmRzLmVuZCgpLCBzdGFydHNbaSAtIDFdKSAtIGVuZHMuYmVnaW4oKSk7CiAgICAgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgY291dCA8PCBkcFttXSA8PCAiXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==