import
java.util.Arrays;
public
class
Main {
static
int
[] seg =
new
int
[
800010
];
static
boolean
[] marked =
new
boolean
[
800010
];
static
void
push(
int
v) {
if
(marked[v]) {
seg[
2
* v] |= seg[v];
seg[
2
* v +
1
] |= seg[v];
marked[v] =
false
;
marked[
2
* v] = marked[
2
* v +
1
] =
true
;
}
}
static
int
getSegment(
int
v,
int
l,
int
r,
int
pos) {
if
(l == r) {
return
seg[v];
}
else
{
push(v);
int
m = (l + r) /
2
;
if
(pos <= m) {
return
getSegment(
2
* v, l, m, pos);
}
else
{
return
getSegment(
2
* v +
1
, m +
1
, r, pos);
}
}
}
static
void
updateSegment(
int
v,
int
l,
int
r,
int
query_l,
int
query_r) {
if
(l == query_l && r == query_r) {
seg[v] |=
1
;
marked[v] =
true
;
}
else
{
push(v);
int
m = (l + r) /
2
;
if
(query_r <= m) {
updateSegment(
2
* v, l, m, query_l, query_r);
}
else
if
(query_l > m) {
updateSegment(
2
* v +
1
, m +
1
, r, query_l, query_r);
}
else
{
updateSegment(
2
* v, l, m, query_l, m);
updateSegment(
2
* v +
1
, m +
1
, r, m +
1
, query_r);
}
seg[v] = seg[
2
* v] | seg[
2
* v +
1
];
}
}
public
static
void
main(String[] args) {
int
N =
5
;
int
K =
2
;
int
M =
3
;
int
[] A = {
8
,
3
,
9
,
1
,
2
};
Arrays.fill(seg,
0
);
Arrays.fill(marked,
false
);
Arrays.sort(A);
for
(
int
i =
0
; i < N; i++) {
int
right = Arrays.binarySearch(A, A[i] + M);
right = right <
0
? -right -
2
: right;
int
left = K + i -
1
;
if
(i ==
0
) {
if
(left <= right) {
updateSegment(
1
,
1
, N, left +
1
, right +
1
);
}
}
else
if
(getSegment(
1
,
1
, N, i) !=
0
) {
if
(left <= right) {
updateSegment(
1
,
1
, N, left +
1
, right +
1
);
}
}
}
if
(getSegment(
1
,
1
, N, N) !=
0
) {
System.out.println(
"YES"
);
}
else
{
System.out.println(
"NO"
);
}
}
}