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 FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,b) FOR(i,0,b)

int read(){
	int i;
	scanf("%d",&i);
	return i;
}

struct SegTree{
	int mx[1<<20];
	int s;
	void Init(int n,int *v){
		s=1;
		while(s<n)s*=2;
		REP(i,s)
			mx[i+s]=i<n?v[i]:0;
		for(int i=s-1;i>=1;i--)
			mx[i]=max(mx[i*2],mx[i*2+1]);
	}
	void Update(int i,int v){
		mx[i+=s]=v;
		while((i/=2)>=1)
			mx[i]=max(mx[i*2],mx[i*2+1]);
	}
	int Get(int b,int e,int l,int r,int i){
		if(e<=l||r<=b)
			return -1;
		if(b<=l&&r<=e)
			return mx[i];
		return max(Get(b,e,l,(l+r)/2,i*2),Get(b,e,(l+r)/2,r,i*2+1));
	}
	int Get(int b,int e){
		if(e<=b)
			return -1;
		else
			return Get(b,e,0,s,1);
	}
} seg;

int p[500000],idx[500001],n,k;

priority_queue<int> pq;
void Add(int i){
	if(seg.Get(max(0,i-k+1),min(n,i+k))<=p[i])
		pq.push(i);
}

int main(){
	n=read();
	k=read();
	REP(i,n)
		idx[p[i]=read()]=i;
	seg.Init(n,p);
	REP(i,n)
		Add(i);
	int x=n;
	while(!pq.empty()){
		int i=pq.top();
		pq.pop();
		if(p[i]<0)
			continue;
		p[i]=-(x--);
		seg.Update(i,-1);
		int g=seg.Get(i+1,min(n,i+k));
		if(g>0)
			Add(idx[g]);
		int h=seg.Get(max(0,i-k+1),i);
		if(h>0)
			Add(idx[h]);
	}
	REP(i,n)
		printf("%d\n",-p[i]);
}