#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
const int MAXM = 100 + 10;
const int MOD = 51061;
const int INF = 1000000001;
struct Seg {
  double l, r, k, b;
  double get_x() const { return -b / k; }
  double get_y(double x) const { return k * x + b; }
  void move(int shift) {
    l += shift;
    r += shift;
    b -= k * shift;
  }
  void add(double k1, double b1) {
    k += k1;
    b += b1;
  }
} A[MAXN << 1];
int N;
double calc() {
  double mx = 1e100, ret;
  for (int i = 1; i <= N; i++) {
    double x = max(A[i].l, min(A[i].r, A[i].get_x()));
    double y = fabs(A[i].get_y(x));
    if (y < mx) {
      mx = y;
      ret = x;
    }
  }
  return ret;
}
double x[MAXN], y[MAXN];
int main() {
  ios::sync_with_stdio(false);
  int n, q, a, b;
  cin >> n >> q >> a >> b;
  for (int i = 1; i <= n; i++) cin >> x[i];
  N = 1;
  A[1].l = 1;
  A[1].r = q;
  A[1].k = 2;
  A[1].b = -2 * x[1];
  y[1] = calc();
  for (int i = 2; i <= n; i++) {
    int m;
    for (m = 1; m <= N && A[m].r <= y[i - 1]; m++)
      ;
    for (int j = N; j >= m; j--) A[j + 2] = A[j];
    N += 2;
    A[m].r = A[m + 2].l = y[i - 1];
    for (int j = 1; j <= m; j++) A[j].move(a);
    for (int j = m + 2; j <= N; j++) A[j].move(b);
    A[m + 1].l = A[m].r;
    A[m + 1].r = A[m + 2].l;
    A[m + 1].k = 0;
    A[m + 1].b = 0;
    while (A[N].l > q) N--;
    A[N].r = q;
    for (int j = 1; j <= N; j++) A[j].add(2, -2 * x[i]);
    y[i] = calc();
  }
  for (int i = n - 1; i >= 1; i--) {
    if (y[i] + b < y[i + 1])
      y[i] = y[i + 1] - b;
    else if (y[i] + a > y[i + 1])
      y[i] = y[i + 1] - a;
  }
  cout.setf(ios::fixed);
  cout.precision(10);
  for (int i = 1; i <= n; i++) cout << y[i] << " ";
  cout << endl;
  double ans = 0;
  for (int i = 1; i <= n; i++) ans += ((y[i] - x[i]) * (y[i] - x[i]));
  cout << ans << endl;
  return 0;
}
