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 RI register int
int read() {
	int q=0;char ch=' ';
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') q=q*10+ch-'0',ch=getchar();
	return q;
}
const int N=500005;
int n,K,tot,js;
int tr[N<<2],a[N],h[N],ne[N<<1],to[N<<1],du[N],ans[N];
priority_queue<int,vector<int>,greater<int> >q;
int query(int l,int r,int s,int t,int i) {
	if(l<=s&&t<=r) return tr[i];
	int mid=(s+t)>>1,re=0;
	if(l<=mid) re=query(l,r,s,mid,i<<1);
	if(mid+1<=r) re=max(re,query(l,r,mid+1,t,(i<<1)|1));
	return re;
}
void chan(int x,int s,int t,int i,int num) {
	if(s==t) {tr[i]=num;return;}
	int mid=(s+t)>>1;
	if(x<=mid) chan(x,s,mid,i<<1,num);
	else chan(x,mid+1,t,(i<<1)|1,num);
	tr[i]=max(tr[i<<1],tr[(i<<1)|1]);
}
void add(int x,int y) {to[++tot]=y,ne[tot]=h[x],h[x]=tot,++du[y];}
void topsort() {
	for(RI i=1;i<=n;++i) if(!du[i]) q.push(i);
	while(!q.empty()) {
		int x=q.top();q.pop(),ans[x]=++js;
		for(RI i=h[x];i;i=ne[i]) {
			--du[to[i]];
			if(!du[to[i]]) q.push(to[i]);
		}
	}
}
int main()
{
	n=read(),K=read();
	for(RI i=1;i<=n;++i) a[read()]=i;
	for(RI i=1;i<=n;++i) {
		int k=query(max(1,a[i]-K+1),a[i],1,n,1);
		if(k) add(a[k],a[i]);
		k=query(a[i],min(n,a[i]+K-1),1,n,1);
		if(k) add(a[k],a[i]);
		chan(a[i],1,n,1,i);
	}
	topsort();
	for(RI i=1;i<=n;++i) printf("%d\n",ans[i]);
	return 0;
}