#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e16;
int n, e, t;
int x[100002];
long long seg1[1 << 18];
long long seg2[1 << 18];
void update(long long seg[], int i, int s, int e, int x, long long v) {
  if (s == e) {
    seg[i] = v;
    return;
  }
  int m = (s + e) / 2;
  if (x <= m)
    update(seg, i << 1, s, m, x, v);
  else
    update(seg, i << 1 | 1, m + 1, e, x, v);
  seg[i] = min(seg[i << 1], seg[i << 1 | 1]);
}
long long query(long long seg[], int i, int s, int e, int x, int y) {
  if (e < x || y < s) return inf;
  if (x <= s && e <= y) return seg[i];
  int m = (s + e) / 2;
  return min(query(seg, i << 1, s, m, x, y),
             query(seg, i << 1 | 1, m + 1, e, x, y));
}
int main() {
  for (int i = 0; i < (1 << 18); ++i) seg1[i] = seg2[i] = inf;
  scanf("%d%d%d", &n, &e, &t);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", x + i);
  }
  update(seg1, 1, 0, n, 0, -x[1]);
  update(seg2, 1, 0, n, 0, -2 * x[1]);
  long long dp;
  for (int i = 1; i <= n; ++i) {
    int j = lower_bound(x, x + (n + 1), x[i] - (t - 1) / 2) - x;
    long long dp1 = query(seg1, 1, 0, n, j - 1, i - 1) + x[i] + t;
    long long dp2 = query(seg2, 1, 0, n, 0, j - 2) + 2 * x[i];
    dp = min(dp1, dp2);
    update(seg1, 1, 0, n, i, dp - x[i + 1]);
    update(seg2, 1, 0, n, i, dp - 2 * x[i + 1]);
  }
  printf("%lld\n", dp + e);
  return 0;
}
