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 N=5e5+10;
const int INF=0x3f3f3f3f;
int n,k,tot,a[N],pos[N],deg[N],ans[N];
set<int> L,R;
vector<int> G[N];

priority_queue<int> q;
void toposort() {
    for (int i=1;i<=n;i++)
        if (deg[i]==0) q.push(-i);
    while (!q.empty()) {
        int x=-q.top(); q.pop();
        a[++tot]=x;
        for (int i=0;i<G[x].size();i++) {
            int y=G[x][i];
            if (--deg[y]==0) q.push(-y);
        }
    }    
}

int Min[N<<2];
void build(int rt,int l,int r) {
    Min[rt]=INF;
    if (l==r) return;
    int mid=l+r>>1;
    build(rt<<1,l,mid); build(rt<<1|1,mid+1,r);
}

void update(int rt,int l,int r,int q,int v)
{
    if (l==r) {Min[rt]=min(Min[rt],v); return;}
    int mid=l+r>>1;
    if (q<=mid) update(rt<<1,l,mid,q,v);
    if (q>mid) update(rt<<1|1,mid+1,r,q,v); 
    Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
}

int query(int rt,int l,int r,int ql,int qr) {
    if (ql<=l && r<=qr) return Min[rt];
    int mid=l+r>>1;
    int ret=INF;
    if (ql<=mid) ret=min(ret,query(rt<<1,l,mid,ql,qr));
    if (qr>mid) ret=min(ret,query(rt<<1|1,mid+1,r,ql,qr));
    return ret; 
}

int main()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    for (int i=1;i<=n;i++) pos[a[i]]=i;
    
    build(1,1,n);
    for (int i=n;i;i--)
	{
        int t1=query(1,1,n,max(1,pos[i]-k+1),pos[i]);
        if (t1<=n) G[pos[i]].push_back(pos[t1]),deg[pos[t1]]++;
        int t2=query(1,1,n,pos[i],min(n,pos[i]+k-1));
        if (t2<=n) G[pos[i]].push_back(pos[t2]),deg[pos[t2]]++;
        update(1,1,n,pos[i],i);
    }
    
    toposort();
    for (int i=1;i<=n;i++) ans[a[i]] = i;
    for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}