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 LL long long

using namespace std;
const int N=5e5+10,M=1e8+10;
int rd()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
    return x*w;
}
int to[N<<1],nt[N<<1],dg[N],hd[N],tot=1;
void adde(int x,int y){++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot,++dg[y];}
int n,m,a[N],an[N];
int mi[N<<2];
void psup(int o){mi[o]=min(mi[o<<1],mi[o<<1|1]);}
void modif(int o,int l,int r,int lx,int x)
{
    if(l==r){mi[o]=x;return;}
    int mid=(l+r)>>1;
    if(lx<=mid) modif(o<<1,l,mid,lx,x);
    else modif(o<<1|1,mid+1,r,lx,x);
    psup(o);
}
int quer(int o,int l,int r,int ll,int rr)
{
    if(ll>rr) return n+1;
    if(ll<=l&&r<=rr) return mi[o];
    int an=n+1,mid=(l+r)>>1;
    if(ll<=mid) an=min(an,quer(o<<1,l,mid,ll,rr));
    if(rr>mid) an=min(an,quer(o<<1|1,mid+1,r,ll,rr));
    psup(o);
    return an;
}
void bui(int o,int l,int r)
{
    if(l==r){mi[o]=n+1;return;}
    int mid=(l+r)>>1;
    bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
    psup(o);
}
struct node
{
    int x;
    bool operator < (const node &bb) const {return a[x]>a[bb.x];}
};
priority_queue<node> q;

int main()
{
////
    n=rd(),m=rd();
    for(int i=1;i<=n;++i) a[rd()]=i;
    bui(1,1,n);
    for(int i=n;i;--i)
    {
	int n1=quer(1,1,n,max(a[i]-m+1,1),a[i]-1),n2=quer(1,1,n,a[i]+1,min(a[i]+m-1,n));
	if(n1<=n) adde(i,n1);
	if(n2<=n) adde(i,n2);
	modif(1,1,n,a[i],i);
    }
    for(int i=1;i<=n;++i)
	if(!dg[i]) q.push((node){i});
    for(int h=1;h<=n;++h)
    {
	int x=q.top().x;
	q.pop();
	an[a[x]]=h;
	for(int i=hd[x];i;i=nt[i])
	{
	    int y=to[i];
	    --dg[y];
	    if(!dg[y]) q.push((node){y});
	}
    }
    for(int i=1;i<=n;++i) printf("%d\n",an[i]);
    return 0;
}
