#include <bits/stdc++.h>
using namespace std;
const int N = 10050;
const double eps = 1e-6;
inline double sqr(double x) { return x * x; }
int n, q, A, B;
struct point {
  double x, y;
  inline point(double _x = 0, double _y = 0) : x(_x), y(_y) {}
  inline bool operator<(const point a) const { return y + eps < a.y; }
};
vector<point> delta;
double Y[N], sum, X[N];
inline double get_minv(vector<point>::iterator &hi,
                       vector<point>::iterator &lo) {
  hi = lower_bound(delta.begin(), delta.end(), point(0, -eps));
  if (fabs(hi->y) <= eps) return hi->x;
  lo = hi - 1;
  return (hi->y * lo->x - hi->x * lo->y) / (hi->y - lo->y);
}
double solve(int i) {
  if (i == n) {
    vector<point>::iterator lo, hi;
    return max(min(get_minv(lo, hi), (double)q), (double)(n - 1) * A + 1);
  }
  if (i == 0) {
    delta.push_back(point(1.0, -1e50));
    delta.push_back(point(1.0, 2.0 * (1 - X[i])));
    delta.push_back(point((double)q, 2.0 * (q - X[i])));
    Y[i] = solve(i + 1);
    sum += sqr(X[i] - Y[i]);
    return 0;
  }
  vector<point>::iterator pos = delta.begin(), hi, lo;
  double minv = get_minv(hi, lo);
  if (A != B) {
    if (fabs(hi->y) <= eps)
      pos = delta.insert(hi, *hi);
    else {
      pos = delta.insert(hi, point(minv, 0));
      pos = delta.insert(pos, point(minv, 0));
    }
  }
  for (vector<point>::iterator it = delta.begin(); it != delta.end(); it++) {
    if (it <= pos)
      it->x += A;
    else
      it->x += B;
    it->y += 2.0 * (it->x - X[i]);
  }
  Y[i] = solve(i + 1);
  sum += sqr(X[i] - Y[i]);
  if (Y[i] >= minv + A && Y[i] <= minv + B)
    return minv;
  else if (Y[i] < minv + A)
    return Y[i] - A;
  else
    return Y[i] - B;
}
int main() {
  scanf("%d%d%d%d", &n, &q, &A, &B);
  for (int i = 0; i < n; ++i) scanf("%lf", X + i);
  solve(0);
  for (int i = 0; i < n; ++i) printf("%.8f%c", Y[i], " \n"[i + 1 == n]);
  printf("%.8f\n", sum);
  return 0;
}
