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 n, k, a[500010], pos[500010], ans[500010];
int t[1050000];
inline void build_tree(int p, int l, int r) {
  if (l == r) {
    t[p] = a[l];
    return;
  }
  int mid = (l + r) >> 1;
  build_tree(p << 1, l, mid);
  build_tree(p << 1 | 1, mid + 1, r);
  t[p] = max(t[p << 1], t[p << 1 | 1]);
}
inline void modify(int p, int l, int r, int pos, int x) {
  if (l == r) {
    t[p] = x;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    modify(p << 1, l, mid, pos, x);
  else
    modify(p << 1 | 1, mid + 1, r, pos, x);
  t[p] = max(t[p << 1], t[p << 1 | 1]);
}
inline int query(int p, int l, int r, int ll, int rr) {
  if (l >= ll && r <= rr) return t[p];
  int mid = (l + r) >> 1, res = 0;
  if (ll <= mid) res = max(res, query(p << 1, l, mid, ll, rr));
  if (rr > mid) res = max(res, query(p << 1 | 1, mid + 1, r, ll, rr));
  return res;
}
bool hv[500010];
priority_queue<int> q;
inline bool ck(int p) {
  return query(1, 0, n - 1, max(0, p - k + 1), min(n - 1, p + k - 1)) == a[p];
}
inline void add(int p) {
  if (hv[p]) return;
  int mx = query(1, 0, n - 1, p, p + k - 1);
  if (mx && ck(pos[mx])) q.push(pos[mx]), hv[p] = true;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]), pos[a[i]] = i;
  build_tree(1, 0, n - 1);
  for (int i = 0; i < n; i += k) add(i);
  for (int i = n - 1; i >= 0; i--) {
    ans[i] = q.top();
    q.pop();
    modify(1, 0, n - 1, ans[i], 0);
    int x = ans[i] / k * k;
    hv[x] = false;
    add(x);
    if (x >= k) add(x - k);
    if (x + k < n) add(x + k);
  }
  for (int i = 0; i < n; i++) printf("%d\n", ans[i] + 1);
  return 0;
}
