#include #include #include #include #include #include #include #include #include //#include //#define ls (x<<1) //#define rs (x<<1|1) //#define mid ((lt[x].l+lt[x].r)/2) //#define ID(x, y) ((x)*m+(y)) #define CHECK(x, y) ((x)>=0 && (x)=0 && (y) PII; const int INF=0x3f3f3f3f; void Open() { #ifndef ONLINE_JUDGE freopen("/home/qingping/in.txt","r",stdin); // freopen("D:/my.txt","w",stdout); #endif // ONLINE_JUDGE } const int N = 100010; int sta[N]; int a[N]; int b[N]; int len[N]; int c[N]; int UP; void add(int x, int val) { for(int i = x; i <= UP; i += i & -i) c[i] = max(c[i], val); } int getma(int x) { int res = 0; for(int i = x; i; i -= i&-i) res = max(res, c[i]); return res; } int main(){ // Open(); int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); int t = 0; for(int i = 1; i <= n; i++) scanf("%d", &a[i]), sta[t++] = a[i]; sort(sta, sta+t); t = unique(sta, sta+t) - sta; UP = t+1; for(int i = 1; i <= n; i++) a[i] = lower_bound(sta, sta+t, a[i]) - sta+1; memset(c, 0, sizeof(c)); for(int i = 1; i <= n; i++) { len[i] = getma(a[i]-1)+1; add(a[i], len[i]); // printf("%d ", len[i]); } // printf("\n"); memset(a, 0, sizeof(a)); for(int i = 1; i <= n; i++) { b[i] = a[len[i]-1]+1; a[len[i]] = max(b[i], a[len[i]]); printf("%d%c", b[i], " \n"[i == n]); } } return 0; }