#include using namespace std; typedef long long ll; template void check_min(T &a, const T &b){ a = (a < b) ? a : b; } template void check_max(T &a, const T &b){ a = (a > b) ? a : b; } #define all(x) (x).begin(), (x).end() const int N = 1e5 + 7; struct Fenwick{ int a[N]; void clear(int n){ for(int i = 0; i <= n + 3; ++i) a[i] = 0; } void update(int i, int v){ for(++i; i < N; i += i & -i) check_max(a[i], v); } int query(int i){ int ans = 0; for(++i; i >= 1; i -= i & -i) check_max(ans, a[i]); return ans; } } f2; int f1[N]; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); freopen("stairway.in", "r", stdin); freopen("stairway.out", "w", stdout); int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 0; i <= n + 3; ++i) f1[i] = -1; f2.clear(n); vector a(n); for(int &x: a) cin >> x; vector idx(all(a)); sort(all(idx)); idx.resize(unique(all(idx)) - idx.begin()); for(int i = 0; i < n; ++i) a[i] = lower_bound(all(idx), a[i]) - idx.begin(); int ans = 0; for(int i = 0; i < n; ++i){ int curr1 = f2.query(a[i] - 1) + 1; int curr2 = f1[a[i]] + 1; check_max(ans, curr2); check_max(f1[a[i]], curr1); f2.update(a[i], curr2); } cout << ans << "\n"; } }