#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool cmin(T& a, const T& b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool cmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
void read(T& x) {
  int f = 1;
  char ch;
  x = 0;
  while (!isdigit(ch = getchar()))
    if (ch == '-') f = -1;
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
const int NX = 6005;
int n, m, q, p, a, b, x[NX];
pair<double, double> s[NX << 1];
double ans[NX];
int main() {
  read(n);
  read(q);
  read(a);
  read(b);
  for (int i = 1; i <= n; i++) read(x[i]);
  for (int i = 1; i <= n; i++) {
    if (i == 1) {
      s[++m] = make_pair(1, 2 * (1 - x[i]));
      s[++m] = make_pair(q, 2 * (q - x[i]));
    } else {
      for (int j = m; j > p; j--) s[j + 2] = s[j];
      m += 2;
      s[p + 1] = make_pair(ans[i - 1], 0);
      s[p + 2] = make_pair(ans[i - 1], 0);
      for (int j = 1; j <= p + 1; j++) s[j].first += a;
      for (int j = p + 2; j <= m; j++) s[j].first += b;
      for (int j = 1; j <= m; j++) s[j].second += 2 * (s[j].first - x[i]);
    }
    if (s[1].second >= 0) {
      p = 0;
      ans[i] = s[1].first;
    } else {
      for (p = 1; p <= m; p++)
        if (s[p].second <= 0 && s[p + 1].second > 0) break;
      ans[i] = s[p].first - s[p].second * (s[p + 1].first - s[p].first) /
                                (s[p + 1].second - s[p].second);
    }
  }
  cmin(ans[n], (double)q);
  for (int i = n - 1; i; i--)
    ans[i] = max(ans[i + 1] - b, min(ans[i], ans[i + 1] - a));
  double cost = 0;
  for (int i = 1; i <= n; i++) {
    printf("%.6lf ", ans[i]);
    cost += (ans[i] - x[i]) * (ans[i] - x[i]);
  }
  printf("\n%.6lf", cost);
  return 0;
}
