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<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 500010
int a[MAXN],n,k,ans[MAXN];
int t[MAXN*4];
int Query(int i,int l,int r,int L,int R)
{
	if(L>R) return t[0];
	if(L<=l&&r<=R) return t[i];
	int mid=(l+r)/2;
	if(R<=mid) return Query(i<<1,l,mid,L,R);
	if(L>mid) return Query(i<<1|1,mid+1,r,L,R);
	return min(Query(i<<1,l,mid,L,R),Query(i<<1|1,mid+1,r,L,R));
}
void Change(int i,int l,int r,int p,int w)
{
	if(l==r)
	{
		t[i]=w;
		return;
	}
	int mid=(l+r)/2;
	if(p<=mid) Change(i<<1,l,mid,p,w);
	else Change(i<<1|1,mid+1,r,p,w);
	t[i]=min(t[i<<1|1],t[i<<1]);
}
int Adj[MAXN],V[MAXN*2],nxt[MAXN*2],c,d[MAXN];
void AddEdge(int u,int v)
{
	d[v]++;c++;V[c]=v,nxt[c]=Adj[u];Adj[u]=c;
}
priority_queue<int ,vector<int>,greater<int> >Q;
void TopSort()
{
	for(int i=1;i<=n;i++) if(!d[i]) Q.push(i);
	int tot=0;
	while(!Q.empty())
	{
		int u=Q.top();Q.pop();
		ans[u]=++tot;
		for(int i=Adj[u];i;i=nxt[i])
			if(!--d[V[i]])
				Q.push(V[i]);
	}
}
int main()
{
//	freopen("swap.in","r",stdin);
//	freopen("swap.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		a[x]=i;
	}
	if(k<=1)
	{
		for(int i=1;i<=n;i++)
			printf("%d\n",i);
		return 0;
	}
	memset(t,0x3f3f3f3f,sizeof t);
	for(int i=n;i;i--)
	{
		int x=Query(1,1,n,a[i]+1,min(a[i]+k-1,n));
		if(x<1e9) AddEdge(a[i],a[x]);
		x=Query(1,1,n,max(a[i]-k+1,1),a[i]-1);
		if(x<1e9) AddEdge(a[i],a[x]);
		Change(1,1,n,a[i],i);
	}
	TopSort();
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
}