//#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i,l,r) for(i = l; i <= r; i++) #define red(i,l,r) for(i=(l);i>=(r);i--) #define u_long unsigned long long #define fff(i, u) for(i = head[u]; i != -1; i = nxt[i]) #define fin() freopen("D:\\CodeBlocks\\2015-12-30\\in.txt", "r", stdin); #define fout() freopen("out.txt", "w", stdout) #define clr(vis, a) memset(vis, a, sizeof(vis)) #define LL long long #define ls id << 1 #define rs id << 1 | 1 #define lson id << 1, l, mid #define rson id << 1 | 1, mid + 1, r #define mid ( (l + r) >> 1 ) #define pb push_back #define mp make_pair #define pii pair #define X first #define Y second #define eps 1e-4 #define pi acos(-1) const int maxn = 1e5 + 10; const int maxm = 3e4 + 10; const LL inf = 1e16 + 10; const LL mod = 1e9+7; int getint() { char c; while((c = getchar()) && !(c >= '0' && c <= '9') && c != '-'); int ret = c - '0', sgn = 0; if(c == '-') sgn = 1, ret = 0; while((c = getchar()) && c >= '0' && c <= '9') ret = ret * 10 + c - '0'; if(sgn) ret = -ret; return ret; } int dp[maxn], n; int mx[maxn], san[maxn], a[maxn]; void add(int x, int val){ while(x < maxn){ mx[x] = max(mx[x], val); x += x & -x; } } int query(int x){ int ans = 0; while(x){ ans = max(ans, mx[x]); x -= x & -x; } return ans; } int main(){ int T = getint(); while(T--){ n = getint(); int cnt = 0; for(int i = 1; i <= n; i ++){ a[i] = getint(); san[++cnt] = a[i]; } sort(san + 1, san + cnt + 1); cnt = unique(san + 1, san + cnt + 1) - san - 1; for(int i = 1; i <= n; i ++){ a[i] = lower_bound(san + 1, san + cnt + 1, a[i]) - san; } clr(mx, 0); for(int i = 1; i <= n; i ++){ int v = query(a[i] - 1); dp[i] = v + 1; add(a[i], dp[i]); } for(int i = 1; i <= n; i ++){ if(i > 1) cout << " "; cout << dp[i]; } cout << endl; } return 0; }