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 <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>

#define For(i, j, k) for(int i = j; i <= k; i++)
#define Forr(i, j, k) for(int i = j; i >= k; i--)

using namespace std;

const int N = 500010;

struct Segment_Tree{
	int Min[N << 2];

	#define lc (o << 1)
	#define rc (o << 1 | 1)
	#define M ((L + R) >> 1)

	Segment_Tree(){
		memset(Min, 0x3f, sizeof Min);
	}

	void modify(int o, int L, int R, int x, int v){
		if(L == R) Min[o] = v;
		else{
			if(x <= M) modify(lc, L, M, x, v);
			else modify(rc, M + 1, R, x, v);
			Min[o] = min(Min[lc], Min[rc]);
		}
	}

	int query(int o, int L, int R, int l, int r){
		if(l <= L && R <= r) return Min[o];
		else{
			int ret = 1e9;
			if(l <= M) ret = query(lc, L, M, l, r);
			if(r > M) ret = min(ret, query(rc, M + 1, R, l, r));
			return ret;
		}
	}
}T;

int n, k;
int Begin[N], Next[N << 1], to[N << 1], deg[N], e;

inline void Add(int u, int v){
	to[++e] = v, Next[e] = Begin[u], Begin[u] = e, ++deg[v];
}

int P[N], A[N];

priority_queue<int> q;

void work(){
	For(i, 1, n) if(!deg[i]) q.push(i);
	Forr(i, n, 1){
		int s = q.top(); q.pop();
		A[s] = i;
		for(int j = Begin[s]; j; j = Next[j]){
			int u = to[j];
			deg[u]--;
			if(!deg[u]) q.push(u);
		}
	}
	For(i, 1, n) printf("%d\n", A[i]);
}

int main(){
	scanf("%d%d", &n, &k);
	For(i, 1, n){
		int x;
		scanf("%d", &x);
		P[x] = i;
	}
	Forr(i, n, 1){
		int x = T.query(1, 1, n, P[i], P[i] + k - 1);
		if(x <= n) Add(P[x], P[i]);
		if(k > 1 && P[i] > 1){
			x = T.query(1, 1, n, P[i] - k + 1, P[i] - 1);
			if(x <= n) Add(P[x], P[i]);
		}
		T.modify(1, 1, n, P[i], i);
	}
	work();
	return 0;
}