E. Pencils and Boxes | Educational Codeforces Round 44

int N, K, D;
cin >> N >> K >> D;
vi A(N);
// とりあえずソートしておく
rep(a, N)cin >> A[a];
sort(all(A));
vi in(N+1), out(N+1);
// 小さい方から0個をすべて使って箱詰めできている
in[0] = 1; out[0] = 1;
ll cur = 0;
rep(a, N) {
    cur += in[a];
    // 小さい方からa個すべて使って箱詰めできている
    if (cur > 0) {
        // 少なくともK個使わなければならない。
        // より大きな鉛筆と一緒に詰めるために
        // いくつかの鉛筆を入れなくて良い。
        // その場合、差がD以下に収まりやすいように、小さいものは
        // すべてまとめたほうがいい。(小さい方から少なくともK個)
        int L = a + K;
        // 差がDを超えない範囲ですべて使える
        int R = lower_bound(all(A), A[a] + D + 1) - A.begin();
        // 小さい方から、L<=b<=R個使って構成できる
        if (L <= R) {
            in[L]++;
            out[R]++;
        }
    }
    cur -= out[a];
}
if (cur+in[N] > 0)cout << "YES" << endl;
else cout << "NO" << endl;