#include <bits/stdc++.h>
inline int lowbit(int a) { return a & (-a); }
int update(int tree[], int a, int b, int n) {
  a++;
  while (a <= n) {
    tree[a] += b;
    a += lowbit(a);
  }
  return 0;
}
int ask(int tree[], int a) {
  a++;
  int resu = 0;
  while (a > 0) {
    resu += tree[a];
    a -= lowbit(a);
  }
  return resu;
}
int tree[2][10000];
int main() {
  int n, l, m, r;
  scanf("%d%d%d%d", &n, &l, &m, &r);
  m *= 2, r *= 2;
  memset(tree[0], 0, sizeof(tree[0]));
  int s, t;
  update(tree[0], 0, 1, m + 1);
  update(tree[0], 1, -1, m + 1);
  for (int i = 1; i <= n; i++) {
    memset(tree[i % 2], 0, sizeof(tree[i % 2]));
    int mass;
    scanf("%d", &mass);
    int a = r * mass, b = l * mass;
    int flag = 0;
    for (int j = 0; j <= m; j++)
      if (ask(tree[(i - 1) % 2], j) > 0) {
        flag = 1;
        s = a + j;
        t = b + j;
        if (s <= m) {
          t = std::min(t, m);
          update(tree[i % 2], s, 1, m + 1);
          update(tree[i % 2], t + 1, -1, m + 1);
        }
        s = j - b;
        t = j - a;
        if (t < 0) {
          int sp = -t;
          int tp = -s;
          s = sp;
          t = tp;
        } else if (s < 0) {
          int sp = 0;
          int tp = std::max(abs(s), abs(t));
          s = sp;
          t = tp;
        }
        if (s <= m) {
          t = std::min(t, m);
          update(tree[i % 2], s, 1, m + 1);
          update(tree[i % 2], t + 1, -1, m + 1);
        }
      }
    if (!flag) {
      printf("No\n");
      return 0;
    }
  }
  int flag = 0;
  for (int i = 0; i <= m; i++)
    if (ask(tree[n % 2], i) > 0) flag = 1;
  printf("%s\n", flag ? "Yes" : "No");
  return 0;
}
