constint MXN = 500005; int T, N, arr[MXN], stk[MXN], top, val1[MXN], mxv[MXN], ans; vector<int> task[MXN];
intquery(int p){ intv(0); while (p) v = max(v, mxv[p]), p -= p & -p; return v; } voidsetv(int p, int v){ while (p <= N) mxv[p] = max(mxv[p], v), p += p & -p; }
intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> T; while (T--) { cin >> N; top = -1; for (inti(0); i != N; ++i) { cin >> arr[i]; task[i].clear(); val1[i] = 0; while (~top && arr[stk[top]] < arr[i]) --top; if (~top) task[stk[top]].push_back(i); stk[++top] = i; } for (inti(1); i <= N; ++i) mxv[i] = 0; ans = 0; for (inti(0); i != N; ++i) { ans = max(ans, val1[i] = max(val1[i], query(arr[i]) + 1)); for (int j : task[i]) { val1[j] = max(val1[j], query(arr[j]) + 2); } setv(arr[i], val1[i]); } cout << ans << endl; } return0; }