#include <bits/stdc++.h>
inline int read() {
  int data = 0, w = 1;
  char ch = getchar();
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
  return data * w;
}
using ll = long double;
const int N(6010);
struct node {
  ll l, r, a, b, c;
} f[N << 1], g[N << 1];
inline ll axis(const node &a) { return -a.b / (2. * a.a); }
inline ll minp(const node &a) {
  ll v = axis(a);
  if (v < a.l) return a.l;
  if (v > a.r) return a.r;
  return v;
}
inline ll eval(const node &a, const ll &x) {
  return a.a * x * x + a.b * x + a.c;
}
inline node move(const node &a, const ll &d) {
  return (node){a.l + d, a.r + d, a.a, a.b - 2 * d * a.a,
                a.c - d * a.b + a.a * d * d};
}
int n, m, Q, A, B, a[N];
ll ans[N], pos[N];
int main() {
  n = read(), Q = read(), A = read(), B = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  f[m = 1] = (node){1., (ll)Q, 1., (ll)-2 * a[1], (ll)a[1] * a[1]};
  for (int i = 2; i <= n; i++) {
    int p = 1, len = m;
    ll v = minp(f[1]), w = eval(f[1], v), _v = 0, _w = 0;
    for (int j = 1; j <= m; j++) {
      _v = minp(f[j]), _w = eval(f[j], _v);
      if (_w < w) {
        w = _w, v = _v, p = j;
      }
    }
    std::memcpy(g + 1, f + 1, sizeof(node) * m), m = 0, pos[i - 1] = v;
    for (int j = 1; j <= p; j++) f[++m] = move(g[j], A);
    f[m].r = v + A, f[++m] = (node){v + A, v + B, 0., 0., w},
    f[++m] = move(g[p], B), f[m].l = v + B;
    for (int j = p + 1; j <= len; j++) f[++m] = move(g[j], B);
    for (int j = 1; j <= m; j++)
      f[j].a += 1, f[j].b -= (ll)2 * a[i], f[j].c += (ll)a[i] * a[i],
          f[j].r = std::min(f[j].r, (ll)Q);
    while (m && f[m].l > f[m].r) --m;
  }
  ll v = minp(f[1]), w = eval(f[1], v), _v = 0, _w = 0;
  for (int j = 1; j <= m; j++) {
    _v = minp(f[j]), _w = eval(f[j], _v);
    if (_w < w) {
      w = _w, v = _v;
    }
  }
  ans[n] = v;
  for (int i = n - 1; i >= 1; i--) {
    if (ans[i + 1] >= pos[i] + B)
      ans[i] = ans[i + 1] - B;
    else if (ans[i + 1] < pos[i] + A)
      ans[i] = ans[i + 1] - A;
    else
      ans[i] = pos[i];
  }
  for (int i = 1; i <= n; i++) printf("%Lf%c", ans[i], " \n"[i == n]);
  printf("%Lf\n", w);
  return 0;
}
