#include <bits/stdc++.h>
using namespace std;
int n, n_;
long long t, e;
long long x[100005];
struct data {
  long long val, lazy;
  data() {}
  data(long long vv, long long la) {
    val = vv;
    lazy = la;
  }
};
data dp[1 << 21];
void lazy_evaluate(int k) {
  dp[k].val += dp[k].lazy;
  if (k + 1 < n_) {
    dp[k * 2 + 1].lazy += dp[k].lazy;
    dp[k * 2 + 2].lazy += dp[k].lazy;
  }
  dp[k].lazy = 0;
}
void lazy_update(int k) {
  dp[k].val = min(dp[k * 2 + 1].val, dp[k * 2 + 2].val);
}
long long query(int a, int b, int k = 0, int l = 0, int r = n_) {
  lazy_evaluate(k);
  if (r <= a || b <= l) return 1000000007LL * 1000000007LL;
  if (a <= l && r <= b) return dp[k].val;
  long long vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
  long long vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
  lazy_update(k);
  return min(vl, vr);
}
void add(int a, int b, long long v, int k = 0, int l = 0, int r = n_) {
  lazy_evaluate(k);
  if (r <= a || b <= l) return;
  if (a <= l && r <= b) {
    dp[k].lazy += v;
    lazy_evaluate(k);
    return;
  }
  add(a, b, v, k * 2 + 1, l, (l + r) / 2);
  add(a, b, v, k * 2 + 2, (l + r) / 2, r);
  lazy_update(k);
}
int main(void) {
  scanf("%d%lld%lld", &n, &e, &t);
  if (n >= 2001) return 0;
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &x[i]);
  }
  n_ = 1;
  while (n_ <= n) n_ *= 2;
  add(1, n + 1, x[n] + n * t);
  int now = 0;
  for (int i = 0; i <= n; i++) {
    if (i > 0) {
      while (now < i) {
        long long ela = x[i] - x[now + 1];
        if (ela + x[i] - x[now + 1] >= t) {
          now++;
        } else {
          long long rest = t - (ela + x[i] - x[now + 1]);
          long long vi = query(i, i + 1);
          long long vi2 = query(now, now + 1);
          if (vi > vi2 + rest) {
            add(i, i + 1, vi2 + rest - vi);
          }
          break;
        }
      }
    }
    long long vi = query(i, i + 1);
    long long vi2 = query(0, now);
    if (vi > vi2) {
      add(i, i + 1, vi2 - vi);
    }
    if (i > 0 && i < n) add(0, i, (x[i + 1] - x[i]) * 2LL);
  }
  printf("%lld\n", query(n, n + 1) + e);
  return 0;
}
