#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
const int MINF = -2e9;
int n;
vector<int> A, P, M, Q, K, BL, BR, tree_seg;
void build(int node, int l, int r) {
if (l == r) {
tree_seg[node] = BR[l];
return;
}
int mid = l + (r - l) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
tree_seg[node] = min(tree_seg[2 * node], tree_seg[2 * node + 1]);
}
int query(int node, int l, int r, int ql, int qr, int x) {
if (l > qr || r < ql || tree_seg[node] >= x) return -1;
if (l == r) return l;
int mid = l + (r - l) / 2;
int res = query(2 * node, l, mid, ql, qr, x);
if (res != -1) return res;
return query(2 * node + 1, mid + 1, r, ql, qr, x);
}
int getMaxY_Q(int val, int lenR) {
int low = 0, high = lenR, ans = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (Q[mid] > val) { ans = mid; low = mid + 1; }
else high = mid - 1;
}
return ans;
}
int getMaxY_K(int val, int lenR) {
int low = 0, high = lenR, ans = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (K[mid] < val) { ans = mid; low = mid + 1; }
else high = mid - 1;
}
return ans;
}
int getMaxX_P(int val, int lenL) {
int low = 0, high = lenL, ans = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (P[mid] > val) { ans = mid; low = mid + 1; }
else high = mid - 1;
}
return ans;
}
int getMaxX_M(int val, int lenL) {
int low = 0, high = lenL, ans = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (M[mid] < val) { ans = mid; low = mid + 1; }
else high = mid - 1;
}
return ans;
}
void solve() {
cin >> n;
A.assign(n + 1, 0);
for (int i = 1; i <= n; i++) cin >> A[i];
int lenL = 0;
P.assign(n + 1, 0); M.assign(n + 1, 0);
P[0] = INF; M[0] = MINF;
for (int i = 1; i <= n; i++) {
if (i == 1) { lenL = 1; P[1] = A[1]; M[1] = A[1]; }
else {
if (A[i] < P[i - 1]) { lenL = i; P[i] = A[i]; M[i] = M[i - 1]; }
else if (A[i] > M[i - 1]) { lenL = i; P[i] = P[i - 1]; M[i] = A[i]; }
else break;
}
}
int lenR = 0;
Q.assign(n + 1, 0); K.assign(n + 1, 0);
Q[0] = INF; K[0] = MINF;
for (int j = 1; j <= n; j++) {
int idx = n - j + 1;
if (j == 1) { lenR = 1; Q[1] = A[idx]; K[1] = A[idx]; }
else {
if (A[idx] < Q[j - 1]) { lenR = j; Q[j] = A[idx]; K[j] = K[j - 1]; }
else if (A[idx] > K[j - 1]) { lenR = j; Q[j] = Q[j - 1]; K[j] = A[idx]; }
else break;
}
}
BL.assign(lenL + 1, 0);
for (int x = 1; x <= lenL; x++) {
if (x == 1) BL[x] = max(getMaxY_Q(A[1], lenR), getMaxY_K(A[1], lenR));
else {
if (A[x] < P[x - 1]) BL[x] = getMaxY_Q(A[x], lenR);
else BL[x] = getMaxY_K(A[x], lenR);
}
}
BR.assign(lenR + 1, 0);
for (int y = 1; y <= lenR; y++) {
int idx = n - y + 1;
if (y == 1) BR[y] = max(getMaxX_P(A[n], lenL), getMaxX_M(A[n], lenL));
else {
if (A[idx] < Q[y - 1]) BR[y] = getMaxX_P(A[idx], lenL);
else BR[y] = getMaxX_M(A[idx], lenL);
}
}
tree_seg.assign(4 * lenR + 5, 0);
if (lenR > 0) build(1, 1, lenR);
vector<int> dp(lenL + 1, -1);
dp[0] = lenR;
int ans = dp[0];
for (int x = 1; x <= lenL; x++) {
int y_curr = min({dp[x - 1], BL[x], n - x});
if (y_curr < 0) {
dp[x] = -1;
continue;
}
int limit = min(lenR, n - x);
if (y_curr < limit) {
int k = query(1, 1, lenR, y_curr + 1, limit, x);
if (k != -1) y_curr = k - 1;
else y_curr = limit;
}
dp[x] = y_curr;
ans = max(ans, x + dp[x]);
}
cout << ans << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
if (cin >> t) {
while (t--) solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgSU5GID0gMmU5Owpjb25zdCBpbnQgTUlORiA9IC0yZTk7CgppbnQgbjsKdmVjdG9yPGludD4gQSwgUCwgTSwgUSwgSywgQkwsIEJSLCB0cmVlX3NlZzsKCnZvaWQgYnVpbGQoaW50IG5vZGUsIGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPT0gcikgewogICAgICAgIHRyZWVfc2VnW25vZGVdID0gQlJbbF07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IGwgKyAociAtIGwpIC8gMjsKICAgIGJ1aWxkKDIgKiBub2RlLCBsLCBtaWQpOwogICAgYnVpbGQoMiAqIG5vZGUgKyAxLCBtaWQgKyAxLCByKTsKICAgIHRyZWVfc2VnW25vZGVdID0gbWluKHRyZWVfc2VnWzIgKiBub2RlXSwgdHJlZV9zZWdbMiAqIG5vZGUgKyAxXSk7Cn0KCmludCBxdWVyeShpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgaW50IHgpIHsKICAgIGlmIChsID4gcXIgfHwgciA8IHFsIHx8IHRyZWVfc2VnW25vZGVdID49IHgpIHJldHVybiAtMTsKICAgIGlmIChsID09IHIpIHJldHVybiBsOwogICAgaW50IG1pZCA9IGwgKyAociAtIGwpIC8gMjsKICAgIGludCByZXMgPSBxdWVyeSgyICogbm9kZSwgbCwgbWlkLCBxbCwgcXIsIHgpOwogICAgaWYgKHJlcyAhPSAtMSkgcmV0dXJuIHJlczsKICAgIHJldHVybiBxdWVyeSgyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIHFsLCBxciwgeCk7Cn0KCmludCBnZXRNYXhZX1EoaW50IHZhbCwgaW50IGxlblIpIHsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbGVuUiwgYW5zID0gMDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICAgIGludCBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdykgLyAyOwogICAgICAgIGlmIChRW21pZF0gPiB2YWwpIHsgYW5zID0gbWlkOyBsb3cgPSBtaWQgKyAxOyB9IAogICAgICAgIGVsc2UgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9CgppbnQgZ2V0TWF4WV9LKGludCB2YWwsIGludCBsZW5SKSB7CiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGxlblIsIGFucyA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKICAgICAgICBpZiAoS1ttaWRdIDwgdmFsKSB7IGFucyA9IG1pZDsgbG93ID0gbWlkICsgMTsgfSAKICAgICAgICBlbHNlIGhpZ2ggPSBtaWQgLSAxOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKaW50IGdldE1heFhfUChpbnQgdmFsLCBpbnQgbGVuTCkgewogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBsZW5MLCBhbnMgPSAwOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgaW50IG1pZCA9IGxvdyArIChoaWdoIC0gbG93KSAvIDI7CiAgICAgICAgaWYgKFBbbWlkXSA+IHZhbCkgeyBhbnMgPSBtaWQ7IGxvdyA9IG1pZCArIDE7IH0gCiAgICAgICAgZWxzZSBoaWdoID0gbWlkIC0gMTsKICAgIH0KICAgIHJldHVybiBhbnM7Cn0KCmludCBnZXRNYXhYX00oaW50IHZhbCwgaW50IGxlbkwpIHsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbGVuTCwgYW5zID0gMDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICAgIGludCBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdykgLyAyOwogICAgICAgIGlmIChNW21pZF0gPCB2YWwpIHsgYW5zID0gbWlkOyBsb3cgPSBtaWQgKyAxOyB9IAogICAgICAgIGVsc2UgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9Cgp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG47CiAgICBBLmFzc2lnbihuICsgMSwgMCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBBW2ldOwoKICAgIGludCBsZW5MID0gMDsKICAgIFAuYXNzaWduKG4gKyAxLCAwKTsgTS5hc3NpZ24obiArIDEsIDApOwogICAgUFswXSA9IElORjsgTVswXSA9IE1JTkY7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBpZiAoaSA9PSAxKSB7IGxlbkwgPSAxOyBQWzFdID0gQVsxXTsgTVsxXSA9IEFbMV07IH0gCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChBW2ldIDwgUFtpIC0gMV0pIHsgbGVuTCA9IGk7IFBbaV0gPSBBW2ldOyBNW2ldID0gTVtpIC0gMV07IH0gCiAgICAgICAgICAgIGVsc2UgaWYgKEFbaV0gPiBNW2kgLSAxXSkgeyBsZW5MID0gaTsgUFtpXSA9IFBbaSAtIDFdOyBNW2ldID0gQVtpXTsgfSAKICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaW50IGxlblIgPSAwOwogICAgUS5hc3NpZ24obiArIDEsIDApOyBLLmFzc2lnbihuICsgMSwgMCk7CiAgICBRWzBdID0gSU5GOyBLWzBdID0gTUlORjsKICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47IGorKykgewogICAgICAgIGludCBpZHggPSBuIC0gaiArIDE7CiAgICAgICAgaWYgKGogPT0gMSkgeyBsZW5SID0gMTsgUVsxXSA9IEFbaWR4XTsgS1sxXSA9IEFbaWR4XTsgfSAKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKEFbaWR4XSA8IFFbaiAtIDFdKSB7IGxlblIgPSBqOyBRW2pdID0gQVtpZHhdOyBLW2pdID0gS1tqIC0gMV07IH0gCiAgICAgICAgICAgIGVsc2UgaWYgKEFbaWR4XSA+IEtbaiAtIDFdKSB7IGxlblIgPSBqOyBRW2pdID0gUVtqIC0gMV07IEtbal0gPSBBW2lkeF07IH0gCiAgICAgICAgICAgIGVsc2UgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIEJMLmFzc2lnbihsZW5MICsgMSwgMCk7CiAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBsZW5MOyB4KyspIHsKICAgICAgICBpZiAoeCA9PSAxKSBCTFt4XSA9IG1heChnZXRNYXhZX1EoQVsxXSwgbGVuUiksIGdldE1heFlfSyhBWzFdLCBsZW5SKSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChBW3hdIDwgUFt4IC0gMV0pIEJMW3hdID0gZ2V0TWF4WV9RKEFbeF0sIGxlblIpOwogICAgICAgICAgICBlbHNlIEJMW3hdID0gZ2V0TWF4WV9LKEFbeF0sIGxlblIpOwogICAgICAgIH0KICAgIH0KCiAgICBCUi5hc3NpZ24obGVuUiArIDEsIDApOwogICAgZm9yIChpbnQgeSA9IDE7IHkgPD0gbGVuUjsgeSsrKSB7CiAgICAgICAgaW50IGlkeCA9IG4gLSB5ICsgMTsKICAgICAgICBpZiAoeSA9PSAxKSBCUlt5XSA9IG1heChnZXRNYXhYX1AoQVtuXSwgbGVuTCksIGdldE1heFhfTShBW25dLCBsZW5MKSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChBW2lkeF0gPCBRW3kgLSAxXSkgQlJbeV0gPSBnZXRNYXhYX1AoQVtpZHhdLCBsZW5MKTsKICAgICAgICAgICAgZWxzZSBCUlt5XSA9IGdldE1heFhfTShBW2lkeF0sIGxlbkwpOwogICAgICAgIH0KICAgIH0KCiAgICB0cmVlX3NlZy5hc3NpZ24oNCAqIGxlblIgKyA1LCAwKTsKICAgIGlmIChsZW5SID4gMCkgYnVpbGQoMSwgMSwgbGVuUik7CgogICAgdmVjdG9yPGludD4gZHAobGVuTCArIDEsIC0xKTsKICAgIGRwWzBdID0gbGVuUjsKICAgIGludCBhbnMgPSBkcFswXTsKCiAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBsZW5MOyB4KyspIHsKICAgICAgICBpbnQgeV9jdXJyID0gbWluKHtkcFt4IC0gMV0sIEJMW3hdLCBuIC0geH0pOwogICAgICAgIGlmICh5X2N1cnIgPCAwKSB7CiAgICAgICAgICAgIGRwW3hdID0gLTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpbnQgbGltaXQgPSBtaW4obGVuUiwgbiAtIHgpOwogICAgICAgIGlmICh5X2N1cnIgPCBsaW1pdCkgewogICAgICAgICAgICBpbnQgayA9IHF1ZXJ5KDEsIDEsIGxlblIsIHlfY3VyciArIDEsIGxpbWl0LCB4KTsKICAgICAgICAgICAgaWYgKGsgIT0gLTEpIHlfY3VyciA9IGsgLSAxOwogICAgICAgICAgICBlbHNlIHlfY3VyciA9IGxpbWl0OwogICAgICAgIH0KICAgICAgICBkcFt4XSA9IHlfY3VycjsKICAgICAgICBhbnMgPSBtYXgoYW5zLCB4ICsgZHBbeF0pOwogICAgfQogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBpbnQgdDsKICAgIGlmIChjaW4gPj4gdCkgewogICAgICAgIHdoaWxlICh0LS0pIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==