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;
int to[1000010], nxt[1000010], mn[1000010];
int a[500010], b[500010], d[500010];
int first[500010];
int n, k, cnt;
priority_queue<int> q;
void add(int x, int y) {
  to[++cnt] = y;
  nxt[cnt] = first[x];
  first[x] = cnt;
  d[y]++;
}
void change(int x, int l, int r, int p, int v) {
  if (l == r) {
    mn[x] = v;
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    change(x << 1, l, mid, p, v);
  else
    change(x << 1 | 1, mid + 1, r, p, v);
  mn[x] = (mn[x << 1]) < (mn[x << 1 | 1]) ? (mn[x << 1]) : (mn[x << 1 | 1]);
}
int query(int x, int l, int r, int s, int t) {
  if (s <= l && r <= t) return mn[x];
  int mid = (l + r) >> 1, ans = 2e8;
  if (s <= mid)
    ans = (ans) < (query(x << 1, l, mid, s, t)) ? (ans)
                                                : (query(x << 1, l, mid, s, t));
  if (t > mid)
    ans = (ans) < (query(x << 1 | 1, mid + 1, r, s, t))
              ? (ans)
              : (query(x << 1 | 1, mid + 1, r, s, t));
  return ans;
}
int main() {
  int x;
  scanf("%d%d", &n, &k);
  memset(mn, 1, sizeof(mn));
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]), a[b[i]] = i;
  for (int i = n; i; i--) {
    x = query(1, 1, n, a[i] - k + 1, a[i]);
    if (x <= n) add(a[x], a[i]);
    x = query(1, 1, n, a[i], a[i] + k - 1);
    if (x <= n) add(a[x], a[i]);
    change(1, 1, n, a[i], i);
  }
  for (int i = 1; i <= n; i++)
    if (!d[i]) q.push(i);
  for (int i = n; i; i--) {
    b[i] = x = q.top();
    q.pop();
    for (int j = first[x]; j; j = nxt[j])
      if ((--d[to[j]]) == 0) q.push(to[j]);
  }
  for (int i = 1; i <= n; i++) a[b[i]] = i;
  for (int i = 1; i <= n; i++) printf("%d\n", a[i]);
  return 0;
}
