#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
const int INF=0x3f3f3f3f;
int n,k,tot,a[maxn],pos[maxn],deg[maxn],ans[maxn];
set<int> L,R;
vector<int> e[maxn];
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<e[x].size();i++) 
        {
            int y=e[x][i];
            if (--deg[y]==0) q.push(-y);
        }
    }    
}

int Min[maxn<<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 ans=INF;
    if (ql<=mid) ans=min(ans,query(rt<<1,l,mid,ql,qr));
    if (qr>mid) ans=min(ans,query(rt<<1|1,mid+1,r,ql,qr));
    return ans; 
}

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) e[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) e[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;
}