#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, q, a[N], node[4 * N];
vector<int> pos[N];
void init(int i, int l, int r) {
  if (l == r) {
    node[i] = (a[l] == 0 ? 1e9 : a[l]);
    return;
  }
  int m = (l + r) >> 1;
  init(i << 1, l, m);
  init(i << 1 | 1, m + 1, r);
  node[i] = min(node[i << 1], node[i << 1 | 1]);
}
int get(int i, int l, int r, int a, int b) {
  if (l > r || a > r || b < l) return (int)1e9;
  if (a <= l && r <= b) return node[i];
  int m = (l + r) >> 1;
  return min(get(i << 1, l, m, a, b), get(i << 1 | 1, m + 1, r, a, b));
}
int main() {
  scanf("%d %d", &n, &q);
  bool f = false;
  bool zero = false;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    if (a[i] == q) f = true;
    if (a[i])
      pos[a[i]].push_back(i);
    else
      zero = true;
  }
  if (!f && !zero) return !printf("NO");
  init(1, 1, n);
  for (int i = 1; i <= q; i++) {
    if (pos[i].size() > 0) {
      if (get(1, 1, n, pos[i][0], pos[i][pos[i].size() - 1]) < i)
        return !printf("NO");
    }
  }
  puts("YES");
  int l = 1;
  while (l <= n) {
    while (l <= n && a[l]) l++;
    int r = l;
    while (r <= n && !a[r]) r++;
    if (l > 1) {
      for (int j = l; j < r; j++) a[j] = f ? a[l - 1] : q;
      if (!f) f = true;
    } else if (r <= n) {
      for (int j = l; j < r; j++) a[j] = f ? a[r] : q;
      if (!f) f = true;
    } else
      for (int j = l; j < r; j++) a[j] = q;
    l = r;
  }
  for (int i = 1; i <= n; i++) printf("%d ", a[i]);
  return 0;
}
