https://nanti.jisuanke.com/t/41303
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int max(int a, int b)
{
return a>b ? a : b;
}
int tree[4 * maxn];
int Pos[maxn];
void pushup(int i)
{
tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
}
void build(int i, int l, int r)
{
tree[i]=0;
if (l == r)
{
tree[i]=0;
return;
}
int mid = (l + r) / 2;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}
void update(int i, int l, int r, int x, int val)
{
if (l == r)
{
tree[i] = val;
return;
}
int mid = (l + r) / 2;
if (x <= mid) update(i << 1, l, mid, x, val);
else update(i << 1 | 1, mid + 1, r, x, val);
pushup(i);
}
int query(int i, int l, int r, int x, int y)
{
if (x <= l && r <= y)
return tree[i];
int minn = 0;
int mid = (l + r) / 2;
int pos=-1;
if (x <= mid) {
minn = max(minn, query(i << 1, l, mid, x, y));
}
if (y>mid) minn = max(minn, query(i << 1 | 1, mid + 1, r, x, y));
return minn;
}
struct node{
int val,pos;
bool operator < (node s){
return val<s.val;
}
}a[maxn];
int dp[maxn];
int main(){
//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].val);
a[i].pos=i;
Pos[a[i].val]=i;
dp[i]=0;
}
build(1,1,n);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
int val=a[i].val;
int pos=a[i].pos;
int maxz=query(1,1,n,max(1,pos-k),min(pos+k,n));
update(1,1,n,pos,val);
if(maxz==0){
dp[Pos[a[i].val]]=1;
}
else dp[Pos[val]]=dp[Pos[maxz]]+1;
}
for(int i=1;i<=n;i++){
printf("%d%c",dp[Pos[a[i].val]],i==n?'\n':' ');
}
}
}