#include <bits/stdc++.h>
using namespace std;
#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
inline void rf()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen(file".inp","r"))
{
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
}
const int mod=998244353;
const int maxn=3e5+15;
const ll inf=1e18;
const int INF = 2e9;
const int MINF = -2e9;
template<typename T> inline void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template<typename T> inline bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template<typename T> inline bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
int n;
vi 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);
}
inline 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;
}
inline 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;
}
inline 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;
}
inline 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);
ff(i, 1, n) cin >> A[i];
int lenL = 0;
P.assign(n + 1, 0); M.assign(n + 1, 0);
P[0] = INF; M[0] = MINF;
ff(i, 1, n)
{
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;
ff(j, 1, n)
{
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);
ff(x, 1, lenL)
{
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);
ff(y, 1, lenR)
{
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);
vi dp(lenL + 1, -1);
dp[0] = lenR;
int ans = dp[0];
ff(x, 1, lenL)
{
int y_curr = min({dp[x - 1], BL[x], n - x});
if (y_curr < 0)
{
dp[x] = -1;
cn;
}
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;
maxi(ans, x + dp[x]);
}
cout << ans << nl;
}
signed main()
{
rf();
int t; cin>>t;
while (t--) solve();
re;
}
CgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAibyIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpPj0oYSk7IC0taSkKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgc3MgIiAiCiNkZWZpbmUgcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBzeihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLCAocykuZW5kKCkKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIGNuIGNvbnRpbnVlCiNkZWZpbmUgcmUgZXhpdCgwKQoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbDsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGw+IHZsbDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgcGFpcjxsbCwgbGw+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZwbGw7CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpsbCByYW4obGwgbCwgbGwgcikKewogICAgcmV0dXJuIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxsbD4gKGwsIHIpKHJuZyk7Cn0KCmlubGluZSB2b2lkIHJmKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKICAgIGlmKGZvcGVuKGZpbGUiLmlucCIsInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKGZpbGUiLmlucCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKGZpbGUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9Cn0KCmNvbnN0IGludCBtb2Q9OTk4MjQ0MzUzOwpjb25zdCBpbnQgbWF4bj0zZTUrMTU7CmNvbnN0IGxsIGluZj0xZTE4Owpjb25zdCBpbnQgSU5GID0gMmU5Owpjb25zdCBpbnQgTUlORiA9IC0yZTk7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBhZGQoVCAmeCwgY29uc3QgVCAmeSkKewogICAgeCs9eTsKICAgIGlmKHg+PW1vZCkgeC09bW9kOwogICAgaWYoeDwwKSB4Kz1tb2Q7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBib29sIG1heGkoVCAmYSwgVCBiKQp7CiAgICBpZihhPj1iKSByZXR1cm4gMDsKICAgIGE9YjsgcmV0dXJuIDE7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBib29sIG1pbmkoVCAmYSwgVCBiKQp7CiAgICBpZihhPD1iKSByZXR1cm4gMDsKICAgIGE9YjsgcmV0dXJuIDE7Cn0KCmludCBuOwp2aSBBLCBQLCBNLCBRLCBLLCBCTCwgQlIsIHRyZWVfc2VnOwoKdm9pZCBidWlsZChpbnQgbm9kZSwgaW50IGwsIGludCByKSAKewogICAgaWYgKGwgPT0gcikgCiAgICB7CiAgICAgICAgdHJlZV9zZWdbbm9kZV0gPSBCUltsXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gbCArIChyIC0gbCkgLyAyOwogICAgYnVpbGQoMiAqIG5vZGUsIGwsIG1pZCk7CiAgICBidWlsZCgyICogbm9kZSArIDEsIG1pZCArIDEsIHIpOwogICAgdHJlZV9zZWdbbm9kZV0gPSBtaW4odHJlZV9zZWdbMiAqIG5vZGVdLCB0cmVlX3NlZ1syICogbm9kZSArIDFdKTsKfQoKaW50IHF1ZXJ5KGludCBub2RlLCBpbnQgbCwgaW50IHIsIGludCBxbCwgaW50IHFyLCBpbnQgeCkKewogICAgaWYgKGwgPiBxciB8fCByIDwgcWwgfHwgdHJlZV9zZWdbbm9kZV0gPj0geCkgcmV0dXJuIC0xOwogICAgaWYgKGwgPT0gcikgcmV0dXJuIGw7CiAgICBpbnQgbWlkID0gbCArIChyIC0gbCkgLyAyOwogICAgaW50IHJlcyA9IHF1ZXJ5KDIgKiBub2RlLCBsLCBtaWQsIHFsLCBxciwgeCk7CiAgICBpZiAocmVzICE9IC0xKSByZXR1cm4gcmVzOwogICAgcmV0dXJuIHF1ZXJ5KDIgKiBub2RlICsgMSwgbWlkICsgMSwgciwgcWwsIHFyLCB4KTsKfQoKaW5saW5lIGludCBnZXRNYXhZX1EoaW50IHZhbCwgaW50IGxlblIpIAp7CiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGxlblIsIGFucyA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIAogICAgewogICAgICAgIGludCBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdykgLyAyOwogICAgICAgIGlmIChRW21pZF0gPiB2YWwpIHsgYW5zID0gbWlkOyBsb3cgPSBtaWQgKyAxOyB9IAogICAgICAgIGVsc2UgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9CgppbmxpbmUgaW50IGdldE1heFlfSyhpbnQgdmFsLCBpbnQgbGVuUikgCnsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbGVuUiwgYW5zID0gMDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgCiAgICB7CiAgICAgICAgaW50IG1pZCA9IGxvdyArIChoaWdoIC0gbG93KSAvIDI7CiAgICAgICAgaWYgKEtbbWlkXSA8IHZhbCkgeyBhbnMgPSBtaWQ7IGxvdyA9IG1pZCArIDE7IH0gCiAgICAgICAgZWxzZSBoaWdoID0gbWlkIC0gMTsKICAgIH0KICAgIHJldHVybiBhbnM7Cn0KCmlubGluZSBpbnQgZ2V0TWF4WF9QKGludCB2YWwsIGludCBsZW5MKSAKewogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBsZW5MLCBhbnMgPSAwOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSAKICAgIHsKICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKICAgICAgICBpZiAoUFttaWRdID4gdmFsKSB7IGFucyA9IG1pZDsgbG93ID0gbWlkICsgMTsgfSAKICAgICAgICBlbHNlIGhpZ2ggPSBtaWQgLSAxOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKaW5saW5lIGludCBnZXRNYXhYX00oaW50IHZhbCwgaW50IGxlbkwpCnsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbGVuTCwgYW5zID0gMDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKICAgIHsKICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKICAgICAgICBpZiAoTVttaWRdIDwgdmFsKSB7IGFucyA9IG1pZDsgbG93ID0gbWlkICsgMTsgfSAKICAgICAgICBlbHNlIGhpZ2ggPSBtaWQgLSAxOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKdm9pZCBzb2x2ZSgpIAp7CiAgICBjaW4gPj4gbjsKICAgIEEuYXNzaWduKG4gKyAxLCAwKTsKICAgIGZmKGksIDEsIG4pIGNpbiA+PiBBW2ldOwoKICAgIGludCBsZW5MID0gMDsKICAgIFAuYXNzaWduKG4gKyAxLCAwKTsgTS5hc3NpZ24obiArIDEsIDApOwogICAgUFswXSA9IElORjsgTVswXSA9IE1JTkY7CiAgICBmZihpLCAxLCBuKQogICAgewogICAgICAgIGlmIChpID09IDEpIHsgbGVuTCA9IDE7IFBbMV0gPSBBWzFdOyBNWzFdID0gQVsxXTsgfSAKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFbaV0gPCBQW2kgLSAxXSkgeyBsZW5MID0gaTsgUFtpXSA9IEFbaV07IE1baV0gPSBNW2kgLSAxXTsgfSAKICAgICAgICAgICAgZWxzZSBpZiAoQVtpXSA+IE1baSAtIDFdKSB7IGxlbkwgPSBpOyBQW2ldID0gUFtpIC0gMV07IE1baV0gPSBBW2ldOyB9IAogICAgICAgICAgICBlbHNlIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbGVuUiA9IDA7CiAgICBRLmFzc2lnbihuICsgMSwgMCk7IEsuYXNzaWduKG4gKyAxLCAwKTsKICAgIFFbMF0gPSBJTkY7IEtbMF0gPSBNSU5GOwogICAgZmYoaiwgMSwgbikgCiAgICB7CiAgICAgICAgaW50IGlkeCA9IG4gLSBqICsgMTsKICAgICAgICBpZiAoaiA9PSAxKSB7IGxlblIgPSAxOyBRWzFdID0gQVtpZHhdOyBLWzFdID0gQVtpZHhdOyB9IAogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBpZiAoQVtpZHhdIDwgUVtqIC0gMV0pIHsgbGVuUiA9IGo7IFFbal0gPSBBW2lkeF07IEtbal0gPSBLW2ogLSAxXTsgfSAKICAgICAgICAgICAgZWxzZSBpZiAoQVtpZHhdID4gS1tqIC0gMV0pIHsgbGVuUiA9IGo7IFFbal0gPSBRW2ogLSAxXTsgS1tqXSA9IEFbaWR4XTsgfSAKICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgQkwuYXNzaWduKGxlbkwgKyAxLCAwKTsKICAgIGZmKHgsIDEsIGxlbkwpIAogICAgewogICAgICAgIGlmICh4ID09IDEpIEJMW3hdID0gbWF4KGdldE1heFlfUShBWzFdLCBsZW5SKSwgZ2V0TWF4WV9LKEFbMV0sIGxlblIpKTsKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFbeF0gPCBQW3ggLSAxXSkgQkxbeF0gPSBnZXRNYXhZX1EoQVt4XSwgbGVuUik7CiAgICAgICAgICAgIGVsc2UgQkxbeF0gPSBnZXRNYXhZX0soQVt4XSwgbGVuUik7CiAgICAgICAgfQogICAgfQoKICAgIEJSLmFzc2lnbihsZW5SICsgMSwgMCk7CiAgICBmZih5LCAxLCBsZW5SKSAKICAgIHsKICAgICAgICBpbnQgaWR4ID0gbiAtIHkgKyAxOwogICAgICAgIGlmICh5ID09IDEpIEJSW3ldID0gbWF4KGdldE1heFhfUChBW25dLCBsZW5MKSwgZ2V0TWF4WF9NKEFbbl0sIGxlbkwpKTsKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFbaWR4XSA8IFFbeSAtIDFdKSBCUlt5XSA9IGdldE1heFhfUChBW2lkeF0sIGxlbkwpOwogICAgICAgICAgICBlbHNlIEJSW3ldID0gZ2V0TWF4WF9NKEFbaWR4XSwgbGVuTCk7CiAgICAgICAgfQogICAgfQoKICAgIHRyZWVfc2VnLmFzc2lnbig0ICogbGVuUiArIDUsIDApOwogICAgaWYgKGxlblIgPiAwKSBidWlsZCgxLCAxLCBsZW5SKTsKCiAgICB2aSBkcChsZW5MICsgMSwgLTEpOwogICAgZHBbMF0gPSBsZW5SOwogICAgaW50IGFucyA9IGRwWzBdOwoKICAgIGZmKHgsIDEsIGxlbkwpIAogICAgewogICAgICAgIGludCB5X2N1cnIgPSBtaW4oe2RwW3ggLSAxXSwgQkxbeF0sIG4gLSB4fSk7CiAgICAgICAgaWYgKHlfY3VyciA8IDApIAogICAgICAgIHsKICAgICAgICAgICAgZHBbeF0gPSAtMTsKICAgICAgICAgICAgY247CiAgICAgICAgfQogICAgICAgIGludCBsaW1pdCA9IG1pbihsZW5SLCBuIC0geCk7CiAgICAgICAgaWYgKHlfY3VyciA8IGxpbWl0KSAKICAgICAgICB7CiAgICAgICAgICAgIGludCBrID0gcXVlcnkoMSwgMSwgbGVuUiwgeV9jdXJyICsgMSwgbGltaXQsIHgpOwogICAgICAgICAgICBpZiAoayAhPSAtMSkgeV9jdXJyID0gayAtIDE7CiAgICAgICAgICAgIGVsc2UgeV9jdXJyID0gbGltaXQ7CiAgICAgICAgfQogICAgICAgIGRwW3hdID0geV9jdXJyOwogICAgICAgIG1heGkoYW5zLCB4ICsgZHBbeF0pOwogICAgfQogICAgY291dCA8PCBhbnMgPDwgbmw7Cn0KCnNpZ25lZCBtYWluKCkKewogICAgcmYoKTsKICAgIGludCB0OyBjaW4+PnQ7CiAgICB3aGlsZSAodC0tKSBzb2x2ZSgpOwogICAgcmU7Cn0=