#include <bits/stdc++.h>
using namespace std;
double eps = 1e-7;
int n, m, A, B, a[6010];
int cmp(double x) {
  if (x > eps) return 1;
  if (x < -eps) return -1;
  return 0;
}
struct line {
  double k, b;
  line(double _k, double _b) { k = _k, b = _b; }
  line(double __x) { k = 2, b = -2 * __x; }
  friend line operator+(const line& u, const line& v) {
    return line(u.k + v.k, u.b + v.b);
  }
  void operator+=(const line& v) { k += v.k, b += v.b; }
  void shift(double x) { b -= k * x; }
  double f(double x) { return k * x + b; }
  double rt() { return -b / k; }
};
vector<line> v;
vector<double> u;
void SHIFT() {
  int tur = -1;
  for (int i = 0; i < v.size(); i++)
    if (cmp(v[i].f(u[i + 1])) != -1 && cmp(v[i].f(u[i])) != 1) tur = i;
  if (tur == -1) {
    if (cmp(v[0].f(u[0])) == 1) tur = -1;
    if (cmp(v.back().f(u.back())) == -1) tur = v.size();
  }
  for (int i = 0; i < v.size(); i++) {
    double x = v[i].rt();
    if (tur == -1 && i == 0) {
      x = u[0], tur++;
      u[i] += A, u[i + 1] += B;
      v.insert(v.begin() + i, line(0, 0));
      u.insert(u.begin() + i + 1, x + B);
      v[i + 1].shift(B);
      i += 1;
      continue;
    }
    if (tur == v.size() && i == v.size() - 1) {
      x = u.back(), tur--;
      u[i] += A, u[i + 1] += B;
      u.insert(u.begin() + i, x + A);
      v.insert(v.begin() + i, line(0, 0));
      v[i].shift(A);
      i += 1;
      continue;
    }
    if (i < tur)
      u[i] += A, v[i].shift(A);
    else if (i > tur)
      u[i + 1] += B, v[i].shift(B);
    else {
      u[i] += A, u[i + 1] += B;
      u.insert(u.begin() + i + 1, x + A);
      u.insert(u.begin() + i + 2, x + B);
      v.insert(v.begin() + i + 1, line(0, 0));
      v.insert(v.begin() + i + 2, v[i]);
      v[i].shift(A);
      v[i + 2].shift(B);
      i += 2;
    }
  }
  int i = 0;
  while (i < u.size() && cmp(u[u.size() - i - 1] - m) == 1) i++;
  u[u.size() - i] = m;
  u.erase(u.end() - i + 1, u.end()), v.erase(v.end() - i + 1, v.end());
}
void ADD(line p) {
  for (auto& i : v) i += p;
}
double pos() {
  if (cmp(v[0].f(u[0])) == 1) return u[0];
  if (cmp(v.back().f(u.back())) == -1) return u.back();
  for (int i = 0; i < v.size(); i++)
    if (cmp(v[i].f(u[i + 1])) != -1 && cmp(v[i].f(u[i])) != 1) return v[i].rt();
  for (int i = 1; i + 1 < u.size(); i++)
    if (cmp(v[i - 1].f(u[i])) == -1 && cmp(v[i].f(u[i])) == 1) return u[i];
}
double b[6010], res;
int main() {
  scanf("%d%d%d%d", &n, &m, &A, &B);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  v.emplace_back(a[1]);
  u.push_back(1), u.push_back(m);
  for (int i = 2; i <= n; i++) b[i - 1] = pos(), SHIFT(), ADD(line(a[i]));
  b[n] = pos();
  for (int i = n; i >= 2; i--) {
    if (cmp(max(b[i] - B, 1.0) - b[i - 1]) == 1)
      b[i - 1] = max(b[i] - B, 1.0);
    else if (cmp(b[i - 1] - max(b[i] - A, 1.0)) == 1)
      b[i - 1] = max(b[i] - A, 1.0);
  }
  for (int i = 1; i <= n; i++)
    printf("%lf ", b[i]), res += (b[i] - a[i]) * (b[i] - a[i]);
  puts("");
  printf("%lf\n", res);
  return 0;
}
