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[i] = pick + 1;
    push_block(blk - 1);
    push_block(blk);
    push_block(blk + 1);
  }
  for (int i = 1; i <= n; i++) cout << ans[i] << "\n";
  return 0;
}
