#include <fstream>
std::ifstream f1("partitie.in");
std::ofstream f2("partitie.out");
struct e {long elem, poz, part;};
long part(struct e sir[300000], long jos, long sus);
void quicksort(struct e sir[300000], long jos, long sus);
long bsearch(struct e sir[300000], long jos, long sus, long nr);
long part2(struct e sir[300000], long jos, long sus);
void quicksort2(struct e sir[300000], long jos, long sus);
struct e m[300000];
int main()
{
long n, d, i, max, poz;
f1>>n>>d;
for (i=0; i<n; i++)
{
f1>>m[i].elem;
m[i].poz=i;
m[i].part=0;
}//for i
quicksort(m, 0, n-1);
max=0;
for (i=0; i<n; i++)
{
if (m[i].part==0)
m[i].part=++max;
if ((m[i].elem+d)<=m[n-1].elem)
{
poz=bsearch(m, 0, n, m[i].elem+d);
while (((m[poz].part>0)||(m[poz].elem<(m[i].elem+d)))&&(poz<n))
poz++;
if (poz<n)
m[poz].part=m[i].part;
}//if
}//for i
quicksort2(m, 0, n-1);
f2<<max<<"\n";
for (i=0; i<n; i++)
f2<<m[i].part<<"\n";
f1.close();
f2.close();
return 0;
}//main
long part(struct e sir[300000], long jos, long sus)
{
long p, q;
struct e temp;
p=jos;
q=sus;
while (p<q)
{
while ((sir[p].elem<=sir[jos].elem)&&(p<=q))
p++;
while ((sir[q].elem>sir[jos].elem)&&(q>=p))
q--;
if (p<q)
{
temp=sir[p];
sir[p]=sir[q];
sir[q]=temp;
}//if
}//while
temp=sir[q];
sir[q]=sir[jos];
sir[jos]=temp;
return q;
}//part
void quicksort(struct e sir[300000], long jos, long sus)
{
if (jos<sus)
{
long p=part(sir, jos, sus);
quicksort(sir, jos, p-1);
quicksort(sir, p+1, sus);
}//if
}//quicksort
long bsearch(struct e sir[300000], long jos, long sus, long nr)
{
int mij=(jos+sus)/2;
while ((jos<=sus)&&(sir[mij].elem!=nr))
{
mij=(jos+sus)/2;
if (sir[mij].elem<nr)
jos=mij+1;
else
if (sir[mij].elem>nr)
sus=mij-1;
}//while
if (sir[mij].elem==nr)
return mij;
else
return mij;
}//bsearch
long part2(struct e sir[300000], long jos, long sus)
{
long p, q;
struct e temp;
p=jos;
q=sus;
while (p<q)
{
while ((sir[p].poz<=sir[jos].poz)&&(p<=q))
p++;
while ((sir[q].poz>sir[jos].poz)&&(q>=p))
q--;
if (p<q)
{
temp=sir[p];
sir[p]=sir[q];
sir[q]=temp;
}//if
}//while
temp=sir[q];
sir[q]=sir[jos];
sir[jos]=temp;
return q;
}//part2
void quicksort2(struct e sir[300000], long jos, long sus)
{
if (jos<sus)
{
long p=part2(sir, jos, sus);
quicksort2(sir, jos, p-1);
quicksort2(sir, p+1, sus);
}//if
}//quicksort2