#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const int inf = 1e9 + 23;
const int size = 1000 * 200;
int h, n;
pair<int, int> a[size];
int type[size], ans[size];
int best = inf;
void update(int Best) {
  best = Best;
  for (int i = 0; i < n; i++) ans[a[i].second] = type[i];
  return;
}
void sol() {
  int Min, Max;
  if (type[n - 1] == type[n - 2]) {
    Min = a[n - 1].first + a[n - 2].first;
    Max = max(a[0].first + a[1].first,
              a[0].first + a[n - 2].first + h * abs(type[0] - type[n - 2]));
    if (Max - Min < best) update(Max - Min);
    return;
  }
  if (type[n - 1] == 1) {
    Min = min(a[n - 1].first + a[n - 2].first + h,
              a[n - 1].first + a[n - 3].first);
    Max = max(a[0].first + a[1].first, a[0].first + a[n - 2].first + h);
    if (Max - Min < best) update(Max - Min);
    int ii = n - 2, Best = best;
    for (int i = n - 3; i > 0; i--) {
      type[i] = 2;
      Max = max(a[0].first + a[1].first, a[0].first + a[i].first + h);
      Min =
          min(a[n - 1].first + a[i - 1].first, a[n - 2].first + a[n - 3].first);
      Min = min(Min, a[n].first + a[n - 1].first + h);
      if (Max - Min < Best) {
        Best = Max - Min;
        ii = i;
      }
    }
    for (int i = 1; i < ii; i++) type[i] = 1;
    if (Best < best) update(Best);
  } else {
    Min = min(a[n - 1].first + a[n - 2].first + h,
              a[n - 2].first + a[n - 3].first);
    Max = max(a[0].first + a[1].first, a[0].first + a[n - 1].first + h);
    if (Max - Min < best) update(Max - Min);
    int ii = n - 3, Best = best;
    for (int i = n - 3; i > 0; i--) {
      type[i] = 2;
      Max = max(a[0].first + a[1].first, a[0].first + a[i].first + h);
      Min = min(a[n - 1].first + a[n - 2].first + h,
                a[n - 1].first + a[n - 3].first);
      Min = min(Min, a[n - 2].first + a[i - 1].first);
      if (Max - Min < Best) {
        Best = Max - Min;
        ii = i;
      }
    }
    if (Best < best) {
      for (int i = 0; i < ii; i++) type[i] = 1;
      update(Best);
    }
    for (int i = 0; i < n - 2; i++) type[i] = 1;
    ii = n - 2;
    for (int i = n - 4; i > 0; i--) {
      Max = max(a[0].first + a[1].first, a[0].first + a[i].first + h);
      Min = min(a[n - 1].first + a[n - 2].first + h,
                a[n - 2].first + a[n - 3].first);
      Min = min(Min, a[n - 1].first + a[i].first);
      if (Max - Min < Best) {
        Best = Max - Min;
        ii = i;
      }
    }
    if (Best < best) {
      type[ii] = 2;
      update(Best);
    }
  }
  return;
}
void print_ans() {
  cout << best << endl;
  for (int i = 0; i < n; i++) cout << ans[i] << " ";
  cout << endl;
}
int main(void) {
  cin >> n >> h;
  for (int i = 0; i < n; i++) {
    cin >> a[i].first;
    a[i].second = i;
  }
  sort(a, a + n);
  reverse(a, a + n);
  if (n == 2) {
    cout << "0" << endl;
    cout << "1 1" << endl;
    return 0;
  }
  for (int t1 = 1; t1 < 3; t1++)
    for (int t2 = 1; t2 < 3; t2++) {
      for (int i = 0; i < n; i++) type[i] = 1;
      type[n - 1] = t1;
      type[n - 2] = t2;
      sol();
    }
  print_ans();
  return 0;
}
