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>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=2000002;
int n,k,num,res,p[maxn],in[maxn],to[maxn],ans[maxn],from[maxn],head[maxn],tree[maxn];
priority_queue < int , vector < int > , greater < int > > Q;
inline void add (int u,int v) {
	from[++num]=head[u];
	++in[v]; to[num]=v;
	head[u]=num;
}
inline void Update (int x,int l,int r,int pos,int val) {
	if(l==pos&&r==pos) { tree[x]=val; return ; }
	register int mid=(l+r)>>1;
	if(pos<=mid) Update(x<<1,l,mid,pos,val);
	else Update(x<<1|1,mid+1,r,pos,val);
	tree[x]=min(tree[x<<1],tree[x<<1|1]);
}
inline void Query (int x,int l,int r,int L,int R) {
	if(L<=l&&r<=R) { res=min(res,tree[x]); return ; }
	register int mid=(l+r)>>1;
	if(L<=mid) Query(x<<1,l,mid,L,R);
	if(R>mid) Query(x<<1|1,mid+1,r,L,R);
}
inline void Topo () {
	register int now=0;
	for(register int i=1;i<=n;++i)
	    if(!in[i]) Q.push(i);
	while(!Q.empty()) {
		register int u=Q.top(); Q.pop();
		ans[u]=++now;
		for(register int i=head[u];i;i=from[i])
		    if(!--in[to[i]]) Q.push(to[i]);
	}
	for(register int i=1;i<=n;++i) printf("%d\n",ans[i]);
}
inline int read () {
    char ch=getchar(); register int num=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) num=(num<<3)+(num<<1)+(ch^'0'),ch=getchar();
    return num;
}
int main () {
    n=read(),k=read(); register int l,r;
    for(register int i=1;i<=n;++i) p[read()]=i;
    memset(tree,INF,sizeof(tree));
    for(register int i=n;i;--i) {
    	l=p[i]+1,r=min(p[i]+k-1,n); res=INF;
		if(l<=r) Query(1,1,n,l,r);
    	if(res!=INF) add(p[i],p[res]);
    	l=max(1,p[i]-k+1),r=p[i]-1; res=INF;
    	if(l<=r) Query(1,1,n,l,r);
    	if(res!=INF) add(p[i],p[res]);
    	Update(1,1,n,p[i],i);
	}
	Topo();
    return 0;
}