#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,p,q;
ll L,M,R,l,r,x,y,tl,tr,m;
vector<pair<ll,ll> > v[2],tmp;
vector<pair<ll,ll> >::iterator bg,ed;
int sgn(ll x){
	return x<0?-1:x>0;
}
bool stand(){
	if(tl > M) return false;
	if(tr > M) tr = M;
	return true;
}
bool gao(){
	tmp.clear();
	for(bg = v[p].begin(),ed=v[p].end();bg!=ed;bg++){
		l = bg->first, r = bg->second;
		tl = l - y;
		tr = r - x;
		if(sgn(tl)*sgn(tr) == -1){
			tr = max(abs(tl),abs(tr));
			tl = 0;
		}
		else{
			tl = abs(tl);
			tr = abs(tr);
			if(tl > tr) swap(tl,tr);
		}
		if(stand()) tmp.push_back(make_pair(tl,tr));
		tl = l + x;
		tr = r + y;
		if(stand()) tmp.push_back(make_pair(tl,tr));
	}
	sort(tmp.begin(),tmp.end());
	tl=tr=-1;
	v[q].clear();
	for(bg=tmp.begin(),ed=tmp.end();bg!=ed;bg++){
		l = bg->first;
		r = bg->second;
		if(l > tr){
			if(tl >= 0) v[q].push_back(make_pair(tl,tr));
			tl = l;
			tr = r;
		}
		else{
			if(r > tr) tr = r;
		}
	}
	if(tl >= 0) v[q].push_back(make_pair(tl,tr));
	p = 1-p;
	q = 1-q;
	return v[p].size() > 0;
}
int main() {
	//freopen("in.txt", "r", stdin);
	while(~scanf("%d%lld%lld%lld",&n,&L,&M,&R)){
		M*=2;
		R*=2;
		v[0].clear();
		v[1].clear();
		p=0,q=1;
		v[0].push_back(make_pair(0,0));
		bool ans = true;
		while(n--){
			scanf("%lld",&m);
			x = R*m;
			y = L*m;
			if(ans) ans = gao();
		}
		puts(ans?"Yes":"No");
	}
	return 0;
}