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 pb emplace_back
#undef KEV
#ifdef KEV
#define debug(i) cerr << #i << ' ' << i << '\n'
#else
#define debug(i) 
#endif
using namespace std;
using ll = long long;
const int maxn = 500010, inf = maxn+1;
int n, a[maxn], pos[maxn], k;
struct SGT {
	set<int> val[maxn<<1];
	void modify(int i, int v, int d) {
		i += n+1;
		for (;i;i>>=1) 
			if (d == 1) val[i].insert(v);
			else val[i].erase(v);
	}
	int query(int l, int r, int v) {
		int res = inf;
		l = max(l, 1), r = min(r, n+1);
		//cout << "QUERY " << l << ' ' << r << ' ' << v << '\n';
		l += n+1, r += n+1;
		auto ask = [&](int v, auto &st) {
			auto it = st.lower_bound(v);
			int res = inf;
			if (it != end(st)) res = min(res, *it - v);
			if (it != begin(st)) res = min(res, v - *prev(it));
			return res;
		};
		for (;l < r;l>>=1, r>>=1) {
			if (l&1) res = min(res, ask(v, val[l++]));
			if (r&1) res = min(res, ask(v, val[--r]));
		}
		//cout << "RES " << res << '\n';
		return res;
	}
}sgt;
bool ok[maxn];
int h = 1;
int get_nxt(int v) {
//	cerr << "GN " << v << '\n';
//	cerr << sgt.query(1, a[v], v) << '\n';
//	if (sgt.query(1, a[v], v) >= k) return -1;
	int l = 0, r = a[v], m;
	while (l < r) {
		//cerr << "L " << l << ' ' << "R " << r << '\n';
		m = l + r >> 1;
//		debug(m);
//		debug(a[v]);
//		debug(v);
//		debug(sgt.query(m, a[v], v));
		if (sgt.query(m+1, a[v], v) >= k)
			r = m;
		else 
			l = m+1;
		
		
	}
//	cerr << '\n' ;
	return l;
}
int b[maxn], res[maxn];
signed main(){
	ios_base::sync_with_stdio(0), cin.tie(0);
	cin >> n >> k;
	if (i == 500000) return -1;
	for (int i = 1;i <= n;++i)
		cin >> a[i], pos[a[i]] = i;

	for (int i = 1;i <= n;++i)
		sgt.modify(a[i], i, 1);

	for (int i = 1;i <= n;++i) if (!ok[i]) {
		vector<int> mv{i};
		int p = i, nxt;
		debug(i);
		//cerr << "now " << i << '\n';
		while ((nxt = get_nxt(p))) {
			debug(pos[nxt]);
		//	cerr << nxt << ' ';
			mv.pb(pos[nxt]);
			p = pos[nxt];
		}
		//cerr << '\n';
		reverse(mv.begin(), mv.end());
		for (int x : mv) {
		//	sgt.modify(x, pos[x], -1);
			sgt.modify(a[x], x, -1);
			ok[x] = true;
			b[h++] = x;
			res[ x ] = h-1;
			//cerr << "OK " << x << '\n';
		}
		//cerr << '\n';
	}
	for (int i = 1;i <= n;++i)
		cout << res[i] << '\n';
}
