
"""
Writer: SPD_9X2
https://atcoder.jp/contests/agc007/tasks/agc007_d

まぁdpだよね
選択は
1.前の奴から引き継ぐ
2.新たに始める
の2択か？

ABCDの4つを同時に回収するとき
Aアメ→Dコインまでの時間は
max(3*(D-A),T+D-A)

待ち時間がちょうどないくらいが望ましいはず
すなわち、2*(D-A)と Tの差が小さくなるように選ぶべき？

左から歩いて行き、毎回止まって待つ場合
時間はE+NTである
ここからどれだけ減らせるかを基準に考えてみよう

T以内にx個追加で回ってこれた場合、減少するのはxT
x個回ってきたが、aだけ時間制限を超えた場合、減少はxT-a
少なくとも回れるならばすべて回ったほうが良い→右方向T/2以下にあるやつは確定で同時に取る
そうでない場合、新たに始める or x-増加分　のコストを払うを選択できる

これをうまくdpに落とし込めないか？？

dp[ai][連続/始点] = その頂点が始点 or 連続点の場合の減少量の最大値
始点は,T/2より1つだけ右にある要素にあげるdpをする(二分探索で位置を求める)
連続の場合、+1のところの連続or始点にあげるdpをする

あげるものは、E+NTからの減少量。よって最大値を求める

始点から上げる場合
iからT/2より+1右にある要素jの始点にあげる場合、(j-i-1)*T 可算
連続にあげる場合は、あまり分を考慮
(j-i)*T - 2*(A[j]-A[i])-T

連続から始点にあげる場合、+-0であげちゃう
連続から連続にあげる場合、T-(A[i+1]-A[i])*2 可算

大体おｋだと思うけど　始点と終点の処理は？
始点は考慮する必要無し
終点は…ちょっと面倒くさい　座標infをおいておけばいいかな
座標infの始点が答えになりそう
"""
import bisect
N,E,T = map(int,input().split())

A = list(map(int,input().split()))
A.append(float("inf"))

dp = [[float("-inf")] * 2 for i in range(N+1)]
dp[0][0] = 0

for i in range(N):

    j = bisect.bisect_right(A,A[i] + T//2)
    dp[j][0] = max(dp[j][0] , dp[i][0] + (j-i-1)*T )
    dp[j][1] = max(dp[j][1] , dp[i][0] + (j-i)*T - (2*(A[j]-A[i]) - T) )

    dp[i+1][0] = max(dp[i+1][0] , dp[i][1])
    dp[i+1][1] = max(dp[i+1][1] , dp[i][1] + T - (A[i+1]-A[i])*2 )

#print (dp)
print (E+N*T - dp[-1][0])
