You are given a permutation P_1 ... P_N of the set {1, 2, ..., N}.

You can apply the following operation to this permutation, any number of times (possibly zero):

* Choose two indices i,j (1 ≦ i < j ≦ N), such that j - i ≧ K and |P_i - P_j| = 1. Then, swap the values of P_i and P_j.



Among all permutations that can be obtained by applying this operation to the given permutation, find the lexicographically smallest one.

Constraints

* 2≦N≦500,000
* 1≦K≦N-1
* P is a permutation of the set {1, 2, ..., N}.

Input

The input is given from Standard Input in the following format:


N K
P_1 P_2 ... P_N


Output

Print the lexicographically smallest permutation that can be obtained.

Examples

Input

4 2
4 2 3 1


Output

2
1
4
3


Input

5 1
5 4 3 2 1


Output

1
2
3
4
5


Input

8 3
4 5 7 8 3 1 2 6


Output

1
2
6
7
5
3
4
8
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> pii;

const int maxn=500111;

#define ls (t<<1)
#define rs ((t<<1)|1)

int p[maxn],q[maxn];
namespace sgt
{
	int mx[1100111];
	void modify(int p,int v,int tl,int tr,int t)
	{
		if(tl==tr)
		{
			mx[t]=v;
			return;
		}
		int mid=(tl+tr)>>1;
		if(p<=mid)modify(p,v,tl,mid,ls);
		else modify(p,v,mid+1,tr,rs);
		mx[t]=max(mx[ls],mx[rs]);
	}
	int query(int l,int r,int tl,int tr,int t)
	{
		if(l<=tl&&tr<=r)return mx[t];
		int mid=(tl+tr)>>1,ret=0;
		if(l<=mid)ret=max(ret,query(l,r,tl,mid,ls));
		if(r>mid)ret=max(ret,query(l,r,mid+1,tr,rs));
		return ret;
	}
}

int n,k,ans[maxn];
bool inq[maxn];

int test(int v)
{
	int val=sgt::query(max(1,v-k+1),min(n,v+k-1),1,n,1);
	if(val==p[v])return true;
	else return false;
}

int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",p+i);
		q[p[i]]=i;
	}
	if(k==1)
	{
		for(int i=1;i<=n;i++)printf("%d\n",i);
		return 0;
	}
	
	priority_queue<int> pq;
	for(int i=1;i<=n;i++)sgt::modify(i,p[i],1,n,1);
	
	for(int i=1;i<=n;i++)if(test(i))
	{
		pq.push(i);
		inq[i]=1;
	}
	
	for(int i=n;i>=1;i--)
	{
		int v=pq.top();pq.pop();
		ans[v]=i;sgt::modify(v,0,1,n,1);
		int mx=q[sgt::query(max(1,v-k+1),v,1,n,1)];
		if(mx&&!inq[mx]&&test(mx))
		{
			inq[mx]=1;
			pq.push(mx);
		}
		mx=q[sgt::query(v,min(n,v+k-1),1,n,1)];
		if(mx&&!inq[mx]&&test(mx))
		{
			inq[mx]=1;
			pq.push(mx);
		}
	}
	
	for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
	return 0;
}