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 maxn = 500500;
using ii = pair<int,int>;
ii tr[maxn + maxn];
int n;
void upd(int p, int v){
	for(tr[p += n] = {v, p}; p > 1; p >>= 1)
		tr[p>>1] = max(tr[p], tr[p^1]);
}
ii qry(int l, int r){
	ii mx = {-1, -1};
	for(l += n, r += n; l < r; l >>= 1, r >>= 1){
		if(l&1) mx = max(mx, tr[l++]);
		if(r&1) mx = max(mx, tr[--r]);
	}
	return mx;
}
int ans[maxn], val[maxn], cval[maxn];;
int main(){
	int k; cin >> n >> k;
	for(int i = n + n; i >= 1; i--) tr[i] = {-1, -1};
	for(int i = 0; i < n; i++){
		int x; cin >> x; x--;
		val[i] = cval[i] = x;
		upd(i, x);
	}
	set<int> do_it;
	auto is_max = [&](int p){
		int l = max(p - k + 1, 0);
		int r = min(p + k, n);
		if(p == qry(l, r).second && val[p] >= 0){
			return true;
		}
		return false;
	};
	auto push_block = [&](int pw){
		if(pw < 0) return;
		if(pw * k >= n) return;
		int l = pw * k;
		int r = min(l + k, n);
		int p = qry(l, r).second;
		if(is_max(p)){
			do_it.insert(p);
		}
	};
	for(int i = 0; i < n; i += k){
		push_block(i / k);
	}
	for(int i = n; i >= 1; i--){
		if(do_it.empty()) break;
		int pick = *prev(do_it.end()); do_it.erase(prev(do_it.end()));
		upd(pick, -1); val[pick] = -1;
		int blk = pick / k;
		ans[pick + 1] = i;
		push_block(blk - 1);
		push_block(blk);
		push_block(blk + 1);
	}
	for(int i = 1; i <= n; i++)
		cout << ans[i] << "\n";
	return 0;
}
