#include <bits/stdc++.h>
using namespace std;
struct nd* nu;
struct nd {
  nd *c[2], *p;
  double x, y, m, k, b, h;
  nd() {}
  nd(double q, double w, double e) {
    x = q;
    y = w;
    m = e;
    k = b = h = 0;
    p = c[0] = c[1] = nu;
  }
  void dn() {
    m += k;
    y += k * x + b;
    c[0]->k += k, c[0]->b += b + c[0]->h * k;
    c[1]->k += k, c[1]->b += b + c[1]->h * k;
    x += h;
    c[0]->h += h;
    c[1]->h += h;
    k = b = h = 0;
  }
  void ro(int d) {
    nd* y = p;
    y->dn();
    dn();
    y->c[d] = c[!d];
    c[!d]->p = y;
    y->p->c[(y->p->c[1] == y)] = this;
    p = y->p;
    c[!d] = y;
    y->p = this;
  }
} * rt;
void sp(nd* x) {
  for (nd* y = x->p; y != nu; y = x->p) {
    int d = y->c[1] == x;
    if (y->p == nu)
      x->ro(d);
    else {
      if ((y->p->c[1] == y) == d)
        y->ro(d), x->ro(d);
      else
        x->ro(d), x->ro(!d);
    }
  }
  x->dn();
}
nd* get(nd* x = rt) {
  if (x == nu) return 0;
  x->dn();
  nd* t = get(x->c[x->y <= 0]);
  return (t || x->y <= 0) ? t : x;
}
void fd(nd*& x) {
  if (x == nu) return;
  while (x->c[1] != nu) x->dn(), x = x->c[1];
}
nd* ins(nd* x, nd* y) {
  if (x == nu) return y;
  if (y == nu) return x;
  fd(x);
  sp(x);
  x->c[1] = y;
  y->p = x;
  return x;
}
double s[300005];
int d[300005];
int main() {
  nu = new nd;
  nu->x = -1e100;
  nu->c[0] = nu->c[1] = nu->p = nu;
  int n, k, a, b;
  double t;
  long double as = 0;
  scanf("%d%d%d%d%d", &n, &k, &a, &b, &d[1]);
  rt = new nd(k, 2 * double(k - d[1]), 2);
  for (int i = 1; i < n; i++) {
    scanf("%d", d + i + 1);
    nd *p = get(), *q;
    sp(p);
    q = p->c[0];
    q->p = nu;
    p->c[0] = nu;
    fd(q);
    t = max(p->x - p->y / p->m, q->x);
    if (t >= double(a) * i - a + 1) {
      q = ins(q, new nd(t, 0, p->m));
      p = ins(new nd(t, 0, 0), p);
      p->h += b;
      q->h += a;
      rt = ins(q, p);
    } else {
      t = double(a) * i - a + 1;
      rt = ins(new nd(t, 0, 0), rt);
      rt->h += b;
      rt->dn();
    }
    rt->k += 2;
    rt->b += -2 * d[i + 1];
    s[i] = t;
  }
  nd *p = get(), *q;
  sp(p);
  q = p->c[0];
  q->p = nu;
  p->c[0] = nu;
  fd(q);
  s[n] =
      min(max(max(p->x - p->y / p->m, q->x), double(a) * n - a + 1), double(k));
  for (int i = n; i; i--) {
    if (s[i] < s[i - 1] + a)
      s[i - 1] = s[i] - a;
    else
      s[i - 1] = max(s[i - 1], s[i] - b);
    as += (long double)(s[i] - d[i]) * (s[i] - d[i]);
  }
  for (int i = 1; i <= n; i++) printf("%.7lf ", s[i]);
  printf("\n%.7lf", double(as));
  return 0;
}
