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;
const int N=5e5+10;
int n,k,a[N],p[N];
struct Treap{
	int v,Min,ran;
	Treap *lc,*rc;
	Treap(int val){Min=v=val;lc=rc=0;ran=rand();}
	void update(){
		Min=v;
		if (lc) Min=min(Min,lc->Min);
		if (rc) Min=min(Min,rc->Min);
	}
}*T;
Treap *merge(Treap *x,Treap *y){
	if (!x) return y;
	if (!y) return x;
	if (x->ran>y->ran){
		x->rc=merge(x->rc,y);
		x->update();
		return x;
	}
	else{
		y->lc=merge(x,y->lc);
		y->update();
		return y;
	}
}
void split(Treap *x,Treap *&lt,Treap *&rt,int key){
	if (!x) return void(lt=rt=0);
	if (x->rc&&x->rc->Min<key){
		split(x->rc,lt,rt,key);
		x->rc=lt;
		(lt=x)->update();
	}
	else if (x->v<key){
		rt=x->rc;
		x->rc=0;
		(lt=x)->update();
	}
	else{
		split(x->lc,lt,rt,key);
		x->lc=rt;
		(rt=x)->update();
	}
}
void visit(Treap *x){
	static int cnt=0;
	if (!x) return;
	visit(x->lc);
	p[++cnt]=x->v;
	visit(x->rc);
}
int main()
{
	srand((unsigned)time(0));
	scanf("%d%d",&n,&k);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]),p[a[i]]=i;
	for (int i=1;i<=n;i++){
		Treap *lt,*rt;
		split(T,lt,rt,p[i]+k);
		T=merge(merge(lt,new Treap(p[i])),rt);
	}
	visit(T);
	for (int i=1;i<=n;i++) a[p[i]]=i;
	for (int i=1;i<=n;i++) printf("%d\n",a[i]);
	return 0;
}