Problem:
Score : 2000 points

Problem Statement

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.

Sample Input 1

4 2
4 2 3 1

Sample Output 1

2
1
4
3

One possible way to obtain the lexicographically smallest permutation is shown below:

4 2 3 1

4 1 3 2

3 1 4 2

2 1 4 3

Sample Input 2

5 1
5 4 3 2 1

Sample Output 2

1
2
3
4
5

Sample Input 3

8 3
4 5 7 8 3 1 2 6

Sample Output 3

1
2
6
7
5
3
4
8

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 500010
int a[MAXN],n,k,ans[MAXN];
int t[MAXN*4];
int Query(int i,int l,int r,int L,int R)
{
	if(L>R) return t[0];
	if(L<=l&&r<=R) return t[i];
	int mid=(l+r)/2;
	if(R<=mid) return Query(i<<1,l,mid,L,R);
	if(L>mid) return Query(i<<1|1,mid+1,r,L,R);
	return min(Query(i<<1,l,mid,L,R),Query(i<<1|1,mid+1,r,L,R));
}
void Change(int i,int l,int r,int p,int w)
{
	if(l==r)
	{
		t[i]=w;
		return;
	}
	int mid=(l+r)/2;
	if(p<=mid) Change(i<<1,l,mid,p,w);
	else Change(i<<1|1,mid+1,r,p,w);
	t[i]=min(t[i<<1|1],t[i<<1]);
}
int Adj[MAXN],V[MAXN*2],nxt[MAXN*2],c,d[MAXN];
void AddEdge(int u,int v)
{
	d[v]++;c++;V[c]=v,nxt[c]=Adj[u];Adj[u]=c;
}
priority_queue<int ,vector<int>,greater<int> >Q;
void TopSort()
{
	for(int i=1;i<=n;i++) if(!d[i]) Q.push(i);
	int tot=0;
	while(!Q.empty())
	{
		int u=Q.top();Q.pop();
		ans[u]=++tot;
		for(int i=Adj[u];i;i=nxt[i])
			if(!--d[V[i]])
				Q.push(V[i]);
	}
}
int main()
{
//	freopen("swap.in","r",stdin);
//	freopen("swap.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		a[x]=i;
	}
	if(k<=1)
	{
		for(int i=1;i<=n;i++)
			printf("%d\n",i);
		return 0;
	}
	memset(t,0x3f3f3f3f,sizeof t);
	for(int i=n;i;i--)
	{
		int x=Query(1,1,n,a[i]+1,min(a[i]+k-1,n));
		if(x<1e9) AddEdge(a[i],a[x]);
		x=Query(1,1,n,max(a[i]-k+1,1),a[i]-1);
		if(x<1e9) AddEdge(a[i],a[x]);
		Change(1,1,n,a[i],i);
	}
	TopSort();
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
}