#include #include #include #include #include #define M 100005 using namespace std; inline void rd(int &res){ char c;res=0; while(c=getchar(),c<48); do res=res*10+(c&15); while(c=getchar(),c>47); } int T,n,A[M],B[M],tree[M<<2],dp[M]; void build(int L,int R,int p){ tree[p]=0; if(L==R)return; int mid=L+R>>1; build(L,mid,p<<1); build(mid+1,R,p<<1|1); } void update(int L,int R,int x,int y,int p){ if(L==R){ tree[p]=max(tree[p],y); return; } int mid=L+R>>1; if(x<=mid)update(L,mid,x,y,p<<1); else update(mid+1,R,x,y,p<<1|1); tree[p]=max(tree[p<<1],tree[p<<1|1]); } int query(int L,int R,int l,int r,int p){ if(L==l&&R==r)return tree[p]; int mid=L+R>>1; if(r<=mid)return query(L,mid,l,r,p<<1); else if(l>mid)return query(mid+1,R,l,r,p<<1|1); else return max(query(L,mid,l,mid,p<<1),query(mid+1,R,mid+1,r,p<<1|1)); } int main(){ rd(T); while(T--){ rd(n); for(int i=1;i<=n;++i)rd(A[i]),B[i]=A[i]; sort(B+1,B+n+1); int len=unique(B+1,B+n+1)-B-1; for(int i=1;i<=n;++i) A[i]=lower_bound(B+1,B+len+1,A[i])-B; build(1,n,1); for(int i=1;i<=n;++i){ if(A[i]==1)dp[i]=1; else{ int k=query(1,n,1,A[i]-1,1); dp[i]=k+1; } update(1,n,A[i],dp[i],1); printf("%d",dp[i]); if(i!=n)printf(" "); } puts(""); } return 0; }