#include <bits/stdc++.h>
using namespace std;
FILE *in;
FILE *out;
struct Element {
  int val, idx;
  bool operator<(const Element &r) const {
    return val != r.val ? val < r.val : idx < r.idx;
  }
};
const int MAX = 131072;
int n, h;
int ans[MAX];
Element a[MAX];
int best, idx1, idx2;
vector<int> dummyVect;
int eval(int i1, int i2) {
  int minn = -1, maxx = -1;
  if (i1 > 0)
    minn = a[0].val;
  else if (i2 < n - 1)
    minn = a[i2 + 1].val;
  if (i2 < n - 1)
    maxx = a[n - 1].val;
  else if (i1 > 0)
    maxx = a[i1 - 1].val;
  int globalMin = minn + a[i1].val + h;
  if (i1 != i2) globalMin = min(globalMin, a[i1].val + a[i1 + 1].val);
  if (i1 > 1) globalMin = min(globalMin, a[0].val + a[1].val);
  if (i2 + 2 < n) globalMin = min(globalMin, a[i2 + 1].val + a[i2 + 2].val);
  if (i1 > 0 && i2 + 1 < n)
    globalMin = min(globalMin, a[0].val + a[i2 + 1].val);
  int globalMax = maxx + a[i2].val + h;
  if (i1 != i2) globalMax = max(globalMax, a[i2].val + a[i2 - 1].val);
  if (i1 > 1) globalMax = max(globalMax, a[i1 - 1].val + a[i1 - 2].val);
  if (i2 + 2 < n) globalMax = max(globalMax, a[n - 1].val + a[n - 2].val);
  if (i1 > 0 && i2 + 1 < n)
    globalMax = max(globalMax, a[i1 - 1].val + a[n - 1].val);
  if (best > globalMax - globalMin) {
    best = globalMax - globalMin;
    idx1 = i1;
    idx2 = i2;
  }
  return globalMax - globalMin;
}
int smarty() {
  idx1 = -1, idx2 = -2;
  best = (a[n - 1].val + a[n - 2].val) - (a[1].val + a[0].val);
  for (int i = 0; i < n; i++) {
    int left = i, right = n - 1 - !i;
    while (left <= right) {
      int m1 = left + (right - left) / 3;
      int m2 = right - (right - left) / 3;
      int a1 = eval(i, m1), a2 = eval(i, m2);
      if (a1 <= a2)
        right = m2 - 1;
      else
        left = m1 + 1;
    }
  }
  for (int i = 0; i < n; i++) {
    if (i >= idx1 && i <= idx2)
      ans[a[i].idx] = 1;
    else
      ans[a[i].idx] = 2;
  }
  return best;
}
int dummy() {
  int dummyAns = (a[n - 1].val + a[n - 2].val) - (a[1].val + a[0].val);
  dummyVect.clear();
  for (int mask = 1; mask < (1 << n) - 1; mask++) {
    vector<int> v[2];
    for (int i = 0; i < n; i++) v[!!(mask & (1 << i))].push_back(a[i].val);
    int globalMin = v[0][0] + v[1][0] + h;
    if ((int)v[0].size() >= 2) globalMin = min(globalMin, v[0][0] + v[0][1]);
    if ((int)v[1].size() >= 2) globalMin = min(globalMin, v[1][0] + v[1][1]);
    int globalMax = v[0].back() + v[1].back() + h;
    if ((int)v[0].size() > 1)
      globalMax = max(globalMax,
                      v[0][(int)v[0].size() - 1] + v[0][(int)v[0].size() - 2]);
    if ((int)v[1].size() > 1)
      globalMax = max(globalMax,
                      v[1][(int)v[1].size() - 1] + v[1][(int)v[1].size() - 2]);
    if (dummyAns > globalMax - globalMin) {
      dummyAns = globalMax - globalMin;
      dummyVect = v[0];
    }
  }
  return dummyAns;
}
void testSolution() {
  for (int i = 0;; i++) {
    n = 5;
    h = rand() % 10;
    for (int c = 0; c < n; c++) {
      a[c].val = rand() % 10;
      a[c].idx = c;
    }
    sort(a, a + n);
    int ans1 = dummy();
    int ans2 = smarty();
    if (ans1 != ans2) {
      fprintf(stderr, "Different (%d vs %d)!\n", ans1, ans2);
      fprintf(stderr, "%d %d\n", n, h);
      for (int c = 0; c < n; c++)
        fprintf(stderr, "%d%c", a[c].val, c + 1 == n ? '\n' : ' ');
      for (int c = 0; c < (int)dummyVect.size(); c++)
        fprintf(stderr, "%d%c", dummyVect[c],
                c + 1 == (int)dummyVect.size() ? '\n' : ' ');
      break;
    }
  }
}
int main(void) {
  in = stdin;
  out = stdout;
  fscanf(in, "%d %d", &n, &h);
  for (int i = 0; i < n; i++) {
    a[i].idx = i;
    fscanf(in, "%d", &a[i].val);
  }
  sort(a, a + n);
  smarty();
  fprintf(out, "%d\n", best);
  for (int i = 0; i < n; i++)
    fprintf(out, "%d%c", ans[i], i + 1 == n ? '\n' : ' ');
  return 0;
}
