#include <bits/stdc++.h>
using namespace std;
const int maxm = 100001;
long long m = 998244353;
vector<long long> fact;
long long add(long long a, long long b, long long mod = m) {
  return ((a % mod) + (b % mod)) % mod;
}
long long mul(long long a, long long b, long long mod = m) {
  return ((a % mod) * (b % mod)) % mod;
}
long long sub(long long a, long long b, long long mod = m) {
  return ((a % mod) - (b % mod) + mod) % mod;
}
long long modmul(long long a, long long b, long long mod = m) {
  long long ans = 0;
  a = a % mod;
  while (b) {
    if (b & 1) ans = add(ans, a, mod);
    a = mul(a, 2, mod);
    b >>= 1;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long fe(long long base, long long exp, long long mod = m) {
  long long ans = 1;
  while (exp) {
    if (exp & 1) ans = mul(ans, base, mod);
    base = mul(base, base, mod);
    exp >>= 1;
  }
  return ans;
}
long long modin(long long a, long long mod = m) { return fe(a, mod - 2, mod); }
long long nCr(long long a, long long b, long long mod = m) {
  if (a < b) return 0;
  return mul(fact[a], mul(modin(fact[b], mod), modin(fact[a - b], mod)));
}
vector<vector<int>> adj;
vector<int> h, sz, in;
void dfs_h_sz(int cur, int par) {
  h[cur] = h[par] + 1;
  sz[cur]++;
  for (const auto &v : adj[cur]) {
    if (v == par) continue;
    dfs_h_sz(v, cur);
    sz[cur] += sz[v];
  }
}
void buildGraph(int n, int m) {
  adj = vector<vector<int>>(n + 1);
  h = vector<int>(n + 1);
  sz = vector<int>(n + 1);
  in = vector<int>(n + 1);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  dfs_h_sz(1, 0);
}
struct cmp {
  bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
    return a.first < b.first;
  }
};
template <typename T>
void dis(vector<T> &vec) {
  for (const auto &v : vec) {
    cout << v << " ";
  }
  cout << "\n";
}
template <typename T1, typename T2>
void disp(vector<pair<T1, T2>> &vec) {
  for (const auto &v : vec) {
    cout << v.first << " " << v.second << "\n";
  }
  cout << "\n";
}
long long ceil(long long a, long long b) { return (a + b - 1) / b; }
void solve() {
  int n, m, d;
  cin >> n >> m >> d;
  vector<int> ans(n);
  set<pair<int, int>> vals;
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    vals.insert(make_pair(a, i));
  }
  int e = 0;
  while (vals.size()) {
    e++;
    auto it = vals.begin();
    long long cur = 0;
    while (vals.size() && it != vals.end()) {
      cur = it->first;
      ans[it->second] = e;
      vals.erase(it);
      cur += 1 + d;
      it = vals.lower_bound(make_pair(cur, 0));
    }
  }
  cout << e << "\n";
  dis(ans);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int test = 1;
  while (test--) {
    solve();
  }
  return 0;
}
