/*
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f3f3f3f3f;
const int N=100000;
int n,m,s;
int a[N+1];
int dp[N+1];
int q[N],head,tail;
signed main(){
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++)cin>>a[i];
	q[tail++]=0;
	int now=-1,mn=inf;
	for(int i=1;i<=n;i++){
		while(now+1<i&&2*a[now+2]<2*a[i]-s)now++,mn=min(mn,dp[now]-a[now]-2*a[now+1]);
		while(head<tail&&q[head]<=now)head++;
		while(head<tail&&dp[q[tail-1]]-a[q[tail-1]]>=dp[i-1]-a[i-1])tail--;
		q[tail++]=i-1;
		dp[i]=mn+3*a[i];
		if(head<tail)dp[i]=min(dp[i],dp[q[head]]-a[q[head]]+a[i]+s);
	}
	cout<<dp[n]+m-a[n]<<"\n";
	return 0;
}
/*1
3 9 1
1 3 8
*/
/*2
3 9 3
1 3 8
*/
/*3
2 1000000000 1000000000
1 999999999
*/