#include <cstdio>
#include <algorithm>
#define IN "partie.in"
#define OUT "partie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17
using namespace std;
int last[1<<14],sol[N_MAX];
struct nr{int n,p;};
nr v[N_MAX];
int N,D;
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d", &N,&D);
FOR(i,1,N)
{
scanf("%d", &v[i].n);
v[i].p = i;
}
}
inline int comp(const nr &x,const nr &y)
{
return x.n < y.n;
}
void solve()
{
sort(v+1, v+N+1, comp );
//FOR(i,1,N)
// printf("%d %d\n",v[i].n,v[i].p);
FOR(i,1,N)
last[i] = -1<<30;
last[0] = 1;
FOR(i,1,N)
{
int ok=0;
FOR(j,1,last[0])
if(v[i].n - last[j] >= D)
{
ok = 1;
last[j] = v[i].n;
sol[ v[i].p ] = j;
break;
}
if(!ok)
{
last[ ++last[0] ] = v[i].n;
sol[ v[i].p ] = last[0];
}
}
printf("%d\n", last[0]);
FOR(i,1,N-1)
printf("%d\n", sol[i]);
FOR(i,1,1<<13)
FOR(j,1,1<<13);
printf("%d\n", sol[N]);
}
int main()
{
scan();
solve();
return 0;
}
/*
#include <cstdio>
#include <algorithm>
#define IN "partie.in"
#define OUT "partie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<19
using namespace std;
int last[N_MAX],sol[N_MAX];
struct nr{int n,p;};
nr v[N_MAX];
int N,D;
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d", &N,&D);
FOR(i,1,N)
{
scanf("%d", &v[i].n);
v[i].p = i;
}
}
inline int comp(const nr &x,const nr &y)
{
return x.n < y.n;
}
void solve()
{
sort(v+1, v+N+1, comp );
//FOR(i,1,N)
// printf("%d %d\n",v[i].n,v[i].p);
FOR(i,1,N)
last[i] = -1<<30;
last[0] = 1;
FOR(i,1,N)
{
int ok=0;
FOR(j,1,last[0])
if(v[i].n - last[j] >= D)
{
ok = 1;
last[j] = v[i].n;
sol[ v[i].p ] = j;
break;
}
if(!ok)
{
last[ ++last[0] ] = v[i].n;
sol[ v[i].p ] = last[0];
}
}
printf("%d\n", last[0]);
FOR(i,1,N)
printf("%d\n", sol[i]);
}
int main()
{
scan();
solve();
return 0;
}
*/