#include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i) #define MP make_pair #define PB push_back #define SZ(x) (int((x).size())) #define ALL(x) (x).begin(), (x).end() #define X first #define Y second template inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } typedef long long LL; typedef pair pii; const LL MOD = 1e9 + 7; template inline bool RD(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1 , ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template inline void PT(T x) { if (x < 0) putchar('-') ,x = -x; if (x > 9) PT(x / 10); putchar(x % 10 + '0'); } const int N = 1e5 + 100; const int INF = 0x3f3f3f3f; int maxn[N]; int res[N]; int a[N]; int n; vector all; int query(int rt) { int ans = 0; for(int i = rt; i ; i -= (i & -i)) ans = max(ans, maxn[i]); return ans; } void update(int rt, int val) { for(int i = rt; i <= n + 2; i += (i & -i)) maxn[i] = max(maxn[i], val); } int main() { int T; RD(T); while(T --) { RD(n); all.clear(); REP(i, 1, n + 1) RD(a[i]), maxn[i] = 0, all.PB(a[i]); maxn[n + 1] = maxn[n + 2] = 0; sort(ALL(all)); all.erase(unique(ALL(all)), all.end()); for(int i = 1; i <= n; i ++) { int val = lower_bound(ALL(all), a[i]) - all.begin() + 1; int ans = query(val - 1) + 1; update(val, ans); printf("%d%c", ans, i == n? '\n': ' '); } } }