#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<ll,ll>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(i,x,g,e) for(int i=g[x];i;i=e[i].next)
#define show(x) cout<<#x<<"="<<x<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showmm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<#x<<'['<<i<<']'<<'['<<j<<"]="<<x[i][j]<<(" \n"[j==b])
#define showm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<x[i][j]<<(" \n"[j==b])
#define showa1(x,a,b) cout<<#x<<":\n";rep(i,a,b) showa(x,i);cout<<endl
#define showa2(x,a,b) cout<<#x<<": ";rep(i,a,b) cout<<x[i]<<' ';cout<<endl
using namespace std;//head
const int maxn=1e5+10,maxm=2e6+10;
const ll INF=0x3f3f3f3f,mod=1e9+7;
int casn,n,m,k;
int a[maxn];
class segtree{public:
#define nd node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
struct segnode {
int l,r,mx;
inline int mid(){return (r+l)>>1;}
inline int len(){return r-l+1;}
}node[maxn<<2|3];
void maketree(int s,int t,int now=1){
nd={s,t,0};
if(s==t) return ;
maketree(s,nd.mid(),now<<1);
maketree(nd.mid()+1,t,now<<1|1);
}
void update(int pos,int x,int now=1){
if(nd.l==nd.r){
nd.mx=x;
return ;
}
if(pos<=ndl.r)update(pos,x,now<<1);
else update(pos,x,now<<1|1);
nd.mx=max(ndl.mx,ndr.mx);
}
int query(int s,int t,int now=1){
if(s<=nd.l&&t>=nd.r) return nd.mx;
int a=0,b=0;
if(s<=ndl.r) a=query(s,t,now<<1);
if(t>ndl.r) b=query(s,t,now<<1|1);
return max(a,b);
}
}tree;
int vis[maxn],dp[maxn];
int main() {IO;
cin>>casn;
while(casn--){
cin>>n>>k;
tree.maketree(1,n);
rep(i,1,n) cin>>a[i];
rep(i,1,n) vis[a[i]]=i;
rep(i,1,n){
int l=max(1,vis[i]-k);
int r=min(n,vis[i]+k);
int x=tree.query(l,r);
dp[i]=dp[x]+1;
tree.update(vis[i],i);
}
cout<<dp[1];
rep(i,2,n){
cout<<' '<<dp[i];
vis[i]=dp[i]=0;
}
if(casn) cout<<'\n';
}
return 0;
}