#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
template <typename It>
void PrintRange(It range_begin, It range_end) {
for (auto it = range_begin; it != range_end; ++it) {
cout << *it << " "s;
}
cout << endl;
}
int main() {
int n;
int d;
cin>>n>>d;
vector<pair<int,int>> v(3*n);
vector<int> stud(n);
for(int i=0;i<n;i++){
int x;
cin>>x;
v[3*i]={2*x-d,-1};
v[3*i+1]={2*x+d,1};
v[3*i+2]={2*x,0};
stud[i]=2*x;
}
sort(v.begin(),v.end());
// PrintRange(v.begin(),v.end());
int cur=0;
int minbil=0;
for(int i=0;i<3*n;i++){
// cout<<i<<", "s<<v[i].first<<", "s<<v[i].second<<", "s<<cur<<endl;
if(v[i].second==-1){
cur++;
} else if(v[i].second==1){
cur--;
} else if(v[i].second==0){
}
minbil=max(minbil,cur);
}
map<int,vector<int>> ma;
cur=0;
for(int i=0;i<3*n;i++){
// cout<<i<<", "s<<v[i].first<<", "s<<v[i].second<<endl;
if(v[i].second==0){
// cout<<cur%minbil<<endl;
ma[v[i].first].push_back(cur%minbil);
// PrintRange(ma[v[i].first].begin(),ma[v[i].first].end());
cur++;
}
}
cout<<minbil<<endl;
for(int i=0;i<n;i++){
cout<<ma[stud[i]].back()+1<<" "s;
// PrintRange(ma[stud[i]].begin(),ma[stud[i]].end());
ma[stud[i]].pop_back();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0PgoKdm9pZCBQcmludFJhbmdlKEl0IHJhbmdlX2JlZ2luLCBJdCByYW5nZV9lbmQpIHsKCWZvciAoYXV0byBpdCA9IHJhbmdlX2JlZ2luOyBpdCAhPSByYW5nZV9lbmQ7ICsraXQpIHsKCQljb3V0IDw8ICppdCA8PCAiICJzOwoJfQoJY291dCA8PCBlbmRsOwp9CgoKCmludCBtYWluKCkgewoJaW50IG47CglpbnQgZDsKCWNpbj4+bj4+ZDsKCXZlY3RvcjxwYWlyPGludCxpbnQ+PiB2KDMqbik7Cgl2ZWN0b3I8aW50PiBzdHVkKG4pOwoJZm9yKGludCBpPTA7aTxuO2krKyl7CgkJaW50IHg7CgkJY2luPj54OwoJCXZbMyppXT17Mip4LWQsLTF9OwoJCXZbMyppKzFdPXsyKngrZCwxfTsKCQl2WzMqaSsyXT17Mip4LDB9OwoJCXN0dWRbaV09Mip4OwoJfQoJc29ydCh2LmJlZ2luKCksdi5lbmQoKSk7Ci8vCVByaW50UmFuZ2Uodi5iZWdpbigpLHYuZW5kKCkpOwoJaW50IGN1cj0wOwoJaW50IG1pbmJpbD0wOwoJZm9yKGludCBpPTA7aTwzKm47aSsrKXsKLy8JCWNvdXQ8PGk8PCIsICJzPDx2W2ldLmZpcnN0PDwiLCAiczw8dltpXS5zZWNvbmQ8PCIsICJzPDxjdXI8PGVuZGw7CgkJaWYodltpXS5zZWNvbmQ9PS0xKXsKCQkJY3VyKys7CgkJfSBlbHNlIGlmKHZbaV0uc2Vjb25kPT0xKXsKCQkJY3VyLS07CgkJfSBlbHNlIGlmKHZbaV0uc2Vjb25kPT0wKXsKCQkKCQl9CgkJCW1pbmJpbD1tYXgobWluYmlsLGN1cik7Cgl9CgoKCW1hcDxpbnQsdmVjdG9yPGludD4+IG1hOwoJY3VyPTA7Cglmb3IoaW50IGk9MDtpPDMqbjtpKyspewovLwkJY291dDw8aTw8IiwgInM8PHZbaV0uZmlyc3Q8PCIsICJzPDx2W2ldLnNlY29uZDw8ZW5kbDsJCgkJaWYodltpXS5zZWNvbmQ9PTApewovLwkJCWNvdXQ8PGN1ciVtaW5iaWw8PGVuZGw7CgkJCW1hW3ZbaV0uZmlyc3RdLnB1c2hfYmFjayhjdXIlbWluYmlsKTsKLy8JCQlQcmludFJhbmdlKG1hW3ZbaV0uZmlyc3RdLmJlZ2luKCksbWFbdltpXS5maXJzdF0uZW5kKCkpOwoJCQljdXIrKzsKCQl9Cgl9CgkKCWNvdXQ8PG1pbmJpbDw8ZW5kbDsKCQoKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWNvdXQ8PG1hW3N0dWRbaV1dLmJhY2soKSsxPDwiICJzOwovLwkJUHJpbnRSYW5nZShtYVtzdHVkW2ldXS5iZWdpbigpLG1hW3N0dWRbaV1dLmVuZCgpKTsKCQltYVtzdHVkW2ldXS5wb3BfYmFjaygpOwoJfQoJCgoJcmV0dXJuIDA7Cn0=