#include <bits/stdc++.h>
using namespace std;
const long long INF = 123456789012345;
const int ST_MAX = (1 << 20);
template <class T>
class ST {
  T x[ST_MAX * 2];
  T eval(T a, T b) { return min(a, b); }
  void ren(int a) {
    x[a] = eval(x[2 * a], x[2 * a + 1]);
    if (a > 0) ren(a / 2);
  }
  T read_ST(int a, int b, int e, int s, int f) {
    if (e <= s || f <= b) return INF;
    if (s <= b && e <= f) return x[a];
    return eval(read_ST(2 * a, b, (b + e) / 2, s, f),
                read_ST(2 * a + 1, (b + e) / 2, e, s, f));
  }

 public:
  ST() { fill(x, x + 2 * ST_MAX, INF); }
  void put(int a, T b) {
    x[a + ST_MAX] = b;
    ren((a + ST_MAX) / 2);
  }
  T get(int s, int f) { return read_ST(1, 0, ST_MAX, s, f); }
};
ST<long long> b;
int N, E, T;
int x[100010];
long long dp[100010];
int main() {
  scanf("%d%d%d", &N, &E, &T);
  for (int i = (int)(1); i < (int)(N + 1); ++i) {
    scanf("%d", x + i);
  }
  long long a = 0;
  b.put(0, 0);
  int z = 1;
  for (int i = (int)(1); i < (int)(N + 1); ++i) {
    while (z < i && T <= 2 * (x[i] - x[z])) {
      a = min(a, dp[z - 1] - 2 * x[z] - x[z - 1]);
      ++z;
    }
    dp[i] = min(a + 3 * x[i], b.get(z - 1, i) + T + x[i]);
    b.put(i, dp[i] - x[i]);
  }
  printf("%lld\n", dp[N] + E - x[N]);
  return 0;
}
