#include <bits/stdc++.h>
using namespace std;
const long long INF = 1LL << 58;
template <typename T>
struct SegmentTree {
  const T INF;
  vector<T> seg;
  int sz;
  SegmentTree(int n) : INF(numeric_limits<T>::max()) {
    sz = 1;
    while (sz < n) sz <<= 1;
    seg.assign(2 * sz - 1, INF);
  }
  T merge(T a, T b) { return (min(a, b)); }
  void set(int k, int x) { seg[k + sz - 1] = x; }
  void build() {
    for (int k = sz - 2; k >= 0; k--) {
      seg[k] = merge(seg[2 * k + 1], seg[2 * k + 2]);
    }
  }
  T rmq(int a, int b, int k, int l, int r) {
    if (a >= r || b <= l) return (INF);
    if (a <= l && r <= b) return (seg[k]);
    return (merge(rmq(a, b, 2 * k + 1, l, (l + r) >> 1),
                  rmq(a, b, 2 * k + 2, (l + r) >> 1, r)));
  }
  T rmq(int a, int b) { return (rmq(a, b, 0, 0, sz)); }
  void update(int k, T x) {
    k += sz - 1;
    seg[k] = x;
    while (k > 0) {
      k = (k - 1) >> 1;
      seg[k] = merge(seg[2 * k + 1], seg[2 * k + 2]);
    }
  }
};
int main() {
  long long N, T, E, X[100002];
  cin >> N >> T >> E;
  if (N > 2000) throw(0);
  for (int i = 1; i <= N; i++) cin >> X[i];
  long long dp[2002][2002];
  fill_n(*dp, 2002 * 2002, INF);
  dp[1][0] = 0;
  dp[1][1] = E;
  auto chmin = [](long long &a, long long b) { a = min(a, b); };
  for (int i = 2; i <= N; i++) {
    for (int j = 0; j < i; j++) {
      chmin(dp[i][j], dp[i - 1][j]);
      chmin(dp[i][i], dp[i - 1][j] + max(E, (X[i] - X[j + 1]) * 2));
    }
  }
  cout << dp[N][N] + T << endl;
}
