#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void chkmin(T &a, T b) {
  if (a > b) a = b;
}
template <class T>
inline void chkmax(T &a, T b) {
  if (a < b) a = b;
}
int n;
double q0, a0, b0;
double y_best[6000], x[6000], chain[6000];
double quad_min(double a, double b, double c) { return -b / (2.0 * a); }
double bound(double h, double v) { return max(1.0 + h, min(q0, v)); }
void pull_chain(int j0, double h, double a, double b, double c,
                double &res_yopt, int &res_j) {
  for (int j = j0; j >= 0; j--) {
    double yi_nat = bound(h, quad_min(a, b, c));
    if (y_best[j] < yi_nat - h - b0) {
      double ny = x[j] + h + b0;
      chain[j] = b0;
      h += b0;
      a += 1.0;
      b += -2.0 * ny;
      c += ny * ny;
    } else if (y_best[j] > yi_nat - h - a0) {
      double ny = x[j] + h + a0;
      chain[j] = a0;
      h += a0;
      a += 1.0;
      b += -2.0 * ny;
      c += ny * ny;
    } else {
      res_yopt = yi_nat;
      res_j = j;
      return;
    }
  }
  res_yopt = bound(h, quad_min(a, b, c));
  res_j = -1;
}
void fill_in_y(int i) {
  while (i >= 0) {
    double anything;
    int j;
    pull_chain(i - 1, 0.0, 1.0, -2.0 * x[i], x[i] * x[i], anything, j);
    for (int k = i - 1; k > j; k--) {
      y_best[k] = y_best[k + 1] - chain[k];
    }
    i = j;
  }
}
int main() {
  scanf("%d%lf%lf%lf", &n, &q0, &a0, &b0);
  for (int i = 0; i < n; i++) scanf("%lf", &x[i]);
  for (int i = 0; i < n; i++) y_best[i] = x[i];
  for (int i = 0; i < n; i++) chain[i] = 0.0;
  for (int i = 1; i < n; i++) {
    double yopt;
    int j;
    pull_chain(i - 1, 0.0, 1.0, -2.0 * x[i], x[i] * x[i], yopt, j);
    y_best[i] = yopt;
  }
  fill_in_y(n - 1);
  double total = 0.0;
  for (int i = 0; i < n; i++) {
    total = total + (y_best[i] - x[i]) * (y_best[i] - x[i]);
  }
  for (int i = 0; i < n; i++) {
    printf("%.8f ", y_best[i]);
  }
  printf("\n%.8lf\n", total);
  return 0;
}
