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>
#define pb push_back
using namespace std;
const int N=5e5+10;
const int inf=1e9;
int gi() {
    int x=0,o=1;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') o=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*o;
}
int n,k,a[N],du[N],b[N],ans[N];
vector<int> E[N];
int tr[N<<2];
#define ls (o<<1)
#define rs (o<<1|1)
void update(int o,int l,int r,int p,int v) {
    if(l==r) { tr[o]=min(tr[o],v);return; }
    int mid=(l+r)>>1;
    p<=mid?update(ls,l,mid,p,v):update(rs,mid+1,r,p,v);
    tr[o]=min(tr[ls],tr[rs]);
}
int query(int o,int l,int r,int L,int R) {
    if(L>R) return inf;
    if(L<=l&&r<=R) return tr[o];
    int mid=(l+r)>>1,ret=inf;
    if(L<=mid) ret=min(ret,query(ls,l,mid,L,R));
    if(R>mid) ret=min(ret,query(rs,mid+1,r,L,R));
    return ret;
}
int main() {
    cin>>n>>k;
    for(int i=1;i<=n;i++) a[gi()]=i;
    memset(tr,0x3f,sizeof(tr));
    for(int i=n;i;i--) {
        int p=query(1,1,n,a[i]+1,min(n,a[i]+k-1));
        if(p<=n) E[a[p]].pb(a[i]),du[a[i]]++;
        p=query(1,1,n,max(1,a[i]-k+1),a[i]-1);
        if(p<=n) E[a[p]].pb(a[i]),du[a[i]]++;
        update(1,1,n,a[i],i);
    }
    priority_queue<int> q;
    int now=n;
    for(int i=1;i<=n;i++) if(!du[i]) q.push(i);
    while(!q.empty()) {
        int u=q.top();q.pop();b[now--]=u;
        for(int v:E[u]) if(!--du[v]) q.push(v);
    }
    for(int i=1;i<=n;i++) ans[b[i]]=i;
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}
//orzgzy
//鸡贼明年进队超稳
