#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
struct segtree {
  struct node {
    long long int min, max, sum;
  };
  vector<node> st;
  long long int ans = 0;
  int n;
  template <typename M>
  segtree(vector<M> &a) {
    n = (int)a.size();
    st.resize(4 * n);
    build(1, 0, n - 1, a);
  }
  void combine(node &a, node &b, node &c) {
    a.sum = b.sum + c.sum;
    a.min = min(b.min, c.min);
    a.max = max(b.max, c.max);
  }
  template <typename M>
  void build(int v, int l, int r, vector<M> &vec) {
    if (l == r) {
      st[v].max = vec[l];
      st[v].min = vec[l];
      st[v].sum = vec[l];
    } else {
      int m = (l + r) / 2;
      build(2 * v, l, m, vec);
      build(2 * v + 1, m + 1, r, vec);
      combine(st[v], st[2 * v], st[2 * v + 1]);
    }
  }
  node query(int v, int l, int r, int l_, int r_) {
    if (l == l_ && r == r_) {
      return st[v];
    }
    int m = (l + r) / 2;
    if (r_ <= m) {
      return query(2 * v, l, m, l_, r_);
    } else if (l_ > m) {
      return query(2 * v + 1, m + 1, r, l_, r_);
    } else {
      node a, b, c;
      b = query(2 * v, l, m, l_, m);
      c = query(2 * v + 1, m + 1, r, m + 1, r_);
      combine(a, b, c);
      return a;
    }
  }
  template <typename M>
  void update(int v, int l, int r, int id, M val) {
    if (l == r) {
      st[v].min = val;
      st[v].max = val;
      st[v].sum = val;
      return;
    }
    int m = (l + r) / 2;
    if (id <= m) {
      update(2 * v, l, m, id, val);
    } else {
      update(2 * v + 1, m + 1, r, id, val);
    }
    combine(st[v], st[2 * v], st[2 * v + 1]);
  }
  long long int query(int l, int r) { return query(1, 0, n - 1, l, r).min; }
  template <typename M>
  void update(int id, M val) {
    update(1, 0, n - 1, id, val);
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long t, n, m, k, q, x, a, b, c, d;
  cin >> n >> q;
  vector<long long> v(n);
  for (int i = 0; i < n; i++) {
    cin >> v[i];
  }
  if (count((v).begin(), (v).end(), 0) == n) {
    cout << "YES\n";
    for (int i = 0; i < n; i++) cout << q << ' ';
    cout << '\n';
  } else {
    int zero = (int)count((v).begin(), (v).end(), 0);
    int que = (int)count((v).begin(), (v).end(), q);
    if (que != 0) {
      if (v[0] != 0) {
        for (int i = 1; i < n; i++) {
          if (v[i] == 0) v[i] = v[i - 1];
        }
      } else {
        a = 0;
        for (int i = 0; i < n; i++) {
          if (v[i] != 0) {
            a = v[i];
            break;
          }
        }
        v[0] = a;
        for (int i = 1; i < n; i++) {
          if (v[i] == 0) v[i] = v[i - 1];
        }
      }
      vector<int> start(q + 1, -1), end(q + 1, -1);
      for (int i = 0; i < n; i++) {
        if (start[v[i]] == -1) {
          start[v[i]] = i;
        }
        end[v[i]] = i;
      }
      segtree st(v);
      for (int i = 1; i <= q; i++) {
        if (start[i] != -1) {
          a = st.query(start[i], end[i]);
          if (a < i) {
            cout << "NO\n";
            return 0;
          }
        }
      }
      cout << "YES\n";
      for (int i = 0; i < n; i++) {
        cout << v[i] << ' ';
      }
      cout << '\n';
    } else if (zero != 0) {
      for (int i = 0; i < n; i++) {
        if (v[i] == 0) {
          v[i] = q;
          break;
        }
      }
      if (v[0] != 0) {
        for (int i = 1; i < n; i++) {
          if (v[i] == 0) v[i] = v[i - 1];
        }
      } else {
        a = 0;
        for (int i = 0; i < n; i++) {
          if (v[i] != 0) {
            a = v[i];
            break;
          }
        }
        v[0] = a;
        for (int i = 1; i < n; i++) {
          if (v[i] == 0) v[i] = v[i - 1];
        }
      }
      vector<int> start(q + 1, -1), end(q + 1, -1);
      for (int i = 0; i < n; i++) {
        if (start[v[i]] == -1) {
          start[v[i]] = i;
        }
        end[v[i]] = i;
      }
      segtree st(v);
      for (int i = 1; i <= q; i++) {
        if (start[i] != -1) {
          a = st.query(start[i], end[i]);
          if (a < i) {
            cout << "NO\n";
            return 0;
          }
        }
      }
      cout << "YES\n";
      for (int i = 0; i < n; i++) {
        cout << v[i] << ' ';
      }
      cout << '\n';
    } else
      cout << "NO\n";
  }
  return 0;
}
