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
// <swap.cpp> - Mon Mar 27 20:17:23 2017
// This file is created by XuYike's black technology automatically.
// Copyright (C) 2015 ChangJun High School, Inc.
// I don't know what this program is.

#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long lol;
#define next NEXT
template<typename T>
inline void gg(T &res){
    res=0;T fh=1;char ch=getchar();
    while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
    if(ch=='-')fh=-1,ch=getchar();
    while(ch>='0'&&ch<='9')res=res*10+ch-'0',ch=getchar();
    res*=fh;
}
inline int gi(){int x;gg(x);return x;}
inline lol gl(){lol x;gg(x);return x;}
const int MAXN=500010;
const int MAXM=1000010;
const int INF=1e9;
int bt,b[MAXN],next[MAXM],to[MAXM],d[MAXN];
inline void add(int x,int y){next[++bt]=b[x];b[x]=bt;to[bt]=y;d[y]++;}
int p[MAXN],q[MAXN];
set <int> s;
set <int>::iterator it;
priority_queue <int,vector<int>,greater<int> > r;
int main(){
    int n=gi(),k=gi();
    for(int i=1;i<=n;i++)q[p[i]=gi()]=i;
    for(int i=1;i<=n;i++){
        if(i>k)s.erase(p[i-k]);
        it=s.insert(p[i]).first;
        if(++it!=s.end())add(i,q[*it]);
    }
    s.clear();
    for(int i=n;i;i--){
        if(i+k<=n)s.erase(p[i+k]);
        it=s.insert(p[i]).first;
        if(++it!=s.end())add(i,q[*it]);
    }
    for(int i=1;i<=n;i++)if(!d[i])r.push(i);
    for(int i=1;i<=n;i++){
        int x=r.top();r.pop();
        p[x]=i;
        for(int j=b[x];j;j=next[j])if(!--d[to[j]])r.push(to[j]);
    }
    for(int i=1;i<=n;i++)printf("%d\n",p[i]);
    return 0;
}