import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.Format;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@SuppressWarnings("unchecked")
public class Main {
public static void main(String[] args) {
solve(System.in, System.out);
}
private void solve(PrintWriter pw, FastScanner fs) {
var N = fs.ni();
var S = fs.ni();
var B = fs.nl();
var Hn = fs.nla(N);
var nowS = S;
var nowH = Hn[0];
var dp = new long[N][S + 1];
for (int i = 0; i < N; i++) {
for (int j = 0; j < S + 1; j++) {
dp[i][j] = -1;
}
}
dp[0][S] = Hn[0];
for (int i = 0; i < N - 1; i++) {
var check = false;
debug(i);
debugArray(dp[i]);
for (int j = 0; j < S + 1; j++) {
if (dp[i][j] >= 0) {
check = true;
}
}
if (!check) {
pw.println("No");
return;
}
//着地したケースも作る
dp[i][S] = Hn[i];
for (int j = S; j >= 0; j--) {
//高度が足りているなら隣へ移動する
if (dp[i][j] >= Hn[i + 1]) {
dp[i + 1][j] = Math.max(dp[i][j], dp[i + 1][j]);
}
//スタミナを減らして上昇する
if (j > 0) {
dp[i][j - 1] = Math.max(dp[i][j] + B, dp[i][j - 1]);
}
}
}
var check = false;
for (int j = 0; j < S + 1; j++) {
if (dp[N - 1][j] >= 0) {
check = true;
}
}
if (!check) {
pw.println("No");
return;
}
pw.println("Yes");
}
//--------------
record TPair(S a, T b) {
}
record TTri(S a, T b, U c) {
}
record Pair(long a, long b) {
}
record IntPair(int a, int b) {
}
record Triple(long a, long b, long c) {
}
public static int[] concat(int[] a, int[] b) {
var ret = new int[a.length + b.length];
for (int i = 0; i < a.length; i++) {
ret[i] = a[i];
}
for (int i = 0; i < b.length; i++) {
ret[i + a.length] = b[i];
}
return ret;
}
public static long[] concat(long[] a, long[] b) {
var ret = new long[a.length + b.length];
for (int i = 0; i < a.length; i++) {
ret[i] = a[i];
}
for (int i = 0; i < b.length; i++) {
ret[i + a.length] = b[i];
}
return ret;
}
public static void solve(InputStream in, PrintStream out) {
PrintWriter pw = new PrintWriter(out);
FastScanner fs = new FastScanner(in);
try {
new Main().solve(pw, fs);
} finally {
pw.flush();
}
}
//-------------------------------------------------------------------
private static void debug(Object x) {
System.err.println(x);
}
private static void debugArray(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
debugArray(arr[i]);
}
}
private static void debugArray(long[][] arr) {
for (int i = 0; i < arr.length; i++) {
debugArray(arr[i]);
}
}
private static void debugArray(int[] arr) {
debug(Arrays.toString(arr));
}
private static void debugArray(long[] arr) {
debug(Arrays.toString(arr));
}
private static void debugArray(boolean[] arr) {
debug(Arrays.toString(arr));
}
private static void debugArray(boolean[][] arr) {
for (int i = 0; i < arr.length; i++) {
debugArray(arr[i]);
}
}
/**
* 各インデックスが配列の長さ以内に収まっているか境界チェックを行う
*
* 多次元配列のチェックをいちいち書くのがしんどい時に。 * arrayBound(new int[]{1,2,3} , new int[]{3,4,3}) * * @param target 配列に設定したいインデックス * @param len 配列の長さ * @return 配列の長さ内に収まってる時 true */ private static boolean inarr(int[] target, int[] len) { var b = true; if (target.length != len.length) { throw new IllegalArgumentException(); } for (int i = 0; i < target.length; i++) { b &= (0 <= target[i] && target[i] < len[i]); } return b; } private static int[] arr(int... a) { return Arrays.copyOf(a, a.length); } private static long[] arr(long... a) { return Arrays.copyOf(a, a.length); } //半時計90度回転 private static int[][] rot(int[][] grid) { var h = grid.length; var w = grid[0].length; var result = new int[w][h]; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { result[w - 1 - j][i] = grid[i][j]; } } return result; } //http://fantom1x.blog130.fc2.com/blog-entry-194.html /** *
配列要素が0のときは、0が返る。
* * @param arr : 探索対象配列(単調増加であること) * @param value : 探索する値 * @returnint : 探索した値以上で、先頭になるインデクス */ public static final int lowerBound(final long[] arr, final long value) { int low = 0; int high = arr.length; int mid; while (low < high) { mid = ((high - low) >>> 1) + low; //(low + high) / 2 (オーバーフロー対策) if (arr[mid] < value) { low = mid + 1; } else { high = mid; } } return low; } /** *配列要素が0のときは、0が返る。
* * @param arr : 探索対象配列(単調増加であること) * @param value : 探索する値 * @returnint : 探索した値より上で、先頭になるインデクス */ public static final int upperBound(final long[] arr, final long value) { int low = 0; int high = arr.length; int mid; while (low < high) { mid = ((high - low) >>> 1) + low; //(low + high) / 2 (オーバーフロー対策) if (arr[mid] <= value) { low = mid + 1; } else { high = mid; } } return low; } //---------------- //------------------------------------------------------------------- } class FastScanner { InputStream in; byte[] buffer = new byte[1 << 10]; int length = 0; int ptr = 0; private final Predicate