import
java.util.Arrays;
import
java.util.Map;
import
java.util.TreeMap;
class
GFG {
static
void
increaseMEX(
int
[] arr,
int
n) {
Map<Integer, Integer> m =
new
TreeMap<>();
int
[] temp = Arrays.copyOf(arr, n);
for
(
int
i =
0
; i < n; i++) {
m.put(arr[i], m.getOrDefault(arr[i],
0
) +
1
);
}
Arrays.sort(temp);
int
mx =
0
;
for
(
int
i =
0
; i < n; i++) {
if
(Arrays.binarySearch(temp, i) >=
0
) {
mx = i +
1
;
continue
;
}
else
{
mx = i;
break
;
}
}
if
(Arrays.binarySearch(temp, mx +
1
) >=
0
) {
int
firstOcc =
0
, lastOcc =
0
;
for
(
int
i =
0
; i < n; i++) {
if
(arr[i] == mx +
1
) {
firstOcc = i;
break
;
}
}
for
(
int
i = n -
1
; i >=
0
; i--) {
if
(arr[i] == mx +
1
) {
lastOcc = i;
break
;
}
}
for
(
int
i = firstOcc; i <= lastOcc; i++) {
arr[i] = mx;
}
}
else
{
for
(
int
i =
0
; i < n; i++) {
if
(arr[i] < mx && m.get(arr[i]) >
1
) {
arr[i] = mx;
break
;
}
else
if
(arr[i] > mx) {
arr[i] = mx;
break
;
}
}
}
Arrays.sort(arr);
int
mx1 =
0
;
for
(
int
i =
0
; i < n; i++) {
if
(Arrays.binarySearch(arr, i) >=
0
) {
mx1 = i +
1
;
continue
;
}
else
{
mx1 = i;
break
;
}
}
if
(mx1 == mx +
1
) {
System.out.println(
"YES"
);
}
else
{
System.out.println(
"NO"
);
}
}
public
static
void
main(String[] args) {
int
[] arr = {
1
,
5
,
0
,
2
,
1
};
int
n = arr.length;
increaseMEX(arr, n);
}
}