#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long n, k, d;
vector<long long> a;
const int mn = 1 << 21;
class _st {
 public:
  int size;
  long long tree[mn], la[mn];
  _st() {
    size = mn >> 1;
    fill(tree, tree + mn, 0);
    fill(la, la + mn, 0);
  }
  void init() {
    for (int i = size - 1; i > 0; i--)
      tree[i] = tree[i << 1] + tree[(i << 1) + 1];
  }
  void pro(int nl, int nr, int n) {
    if (!la[n]) return;
    if (n < size) {
      la[n << 1] += la[n];
      la[(n << 1) + 1] += la[n];
    }
    tree[n] += la[n] * (nr - nl);
    la[n] = 0;
  }
  long long sum(int nl, int nr, int n, int l, int r) {
    pro(nl, nr, n);
    if (r <= nl | l >= nr) return 0;
    if (r >= nr & l <= nl) return tree[n];
    int m = (nl + nr) / 2;
    return sum(nl, m, n << 1, l, r) + sum(m, nr, (n << 1) + 1, l, r);
  }
  void add(int nl, int nr, int n, int l, int r, int k) {
    pro(nl, nr, n);
    if (r <= nl | l >= nr) return;
    if (r >= nr & l <= nl) {
      la[n] += k;
      pro(nl, nr, n);
      return;
    }
    int m = (nl + nr) / 2;
    add(nl, m, n << 1, l, r, k);
    add(m, nr, (n << 1) + 1, l, r, k);
    tree[n] = tree[n << 1] + tree[(n << 1) + 1];
  }
  long long sum(int l, int r) { return sum(0, size, 1, l, r); }
  void add(int l, int r, int k) {
    if (l >= r) return;
    add(0, size, 1, l, r, k);
  }
};
_st st;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> k >> d;
  a.resize(n);
  for (auto &e : a) cin >> e;
  sort(a.begin(), a.end());
  st.add(n - 1, n, 1);
  bool ans = 0;
  for (long long i = n - 1; i >= k - 1; i--)
    if (st.sum(i, i + 1)) {
      int ti = (int)(lower_bound(a.begin(), a.end(), a[i] - d) - a.begin());
      int ti2 = (int)max(0ll, i - k + 1);
      if (ti)
        ti--;
      else
        ans = 1;
      st.add(ti, ti2, 1);
    }
  if (ans)
    cout << "YES";
  else
    cout << "NO";
}
