#include <bits/stdc++.h>
#define int long long
#define destroy printf("NO"), exit(0)
using namespace std;
const int N = 2e5 + 10;
int a[N], l[N], r[N], cnt[N];
namespace Sgt1
{
struct Node
{
int l, r;
int mi;
void init(int p)
{
l = r = p;
if (a[p]) mi = a[p];
else mi = 1e18;
}
} z[N << 2];
Node operator+(const Node &lhs, const Node &rhs)
{
Node res;
res.l = lhs.l, res.r = rhs.r;
res.mi = min(lhs.mi, rhs.mi);
return res;
}
void build(int l, int r, int rt)
{
if (l == r)
return (void)z[rt].init(l);
int mid = l + r >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
z[rt] = z[rt << 1] + z[rt << 1 | 1];
}
int query(int l, int r, int rt, int nowl, int nowr)
{
if (nowl <= l && r <= nowr)
return z[rt].mi;
int mi = 1e18, mid = l + r >> 1;
if (nowl <= mid) mi = min(mi, query(l, mid, rt << 1, nowl, nowr));
if (mid < nowr) mi = min(mi, query(mid + 1, r, rt << 1 | 1, nowl, nowr));
return mi;
}
}
namespace Sgt2
{
struct Node
{
int l, r;
int sum, tag;
void init(int p)
{
l = r = p;
sum = tag = 0;
}
void color(int p)
{
sum = p, tag = p;
}
} z[N << 2];
Node operator+(const Node &lhs, const Node &rhs)
{
Node res;
res.l = lhs.l, res.r = rhs.r;
res.sum = lhs.sum + rhs.sum;
res.tag = 0;
return res;
}
void build(int l, int r, int rt)
{
if (l == r)
return (void)z[rt].init(l);
int mid = l + r >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
z[rt] = z[rt << 1] + z[rt << 1 | 1];
}
void push_down(int rt)
{
if (z[rt].tag)
{
z[rt << 1].color(z[rt].tag);
z[rt << 1 | 1].color(z[rt].tag);
z[rt].tag = 0;
}
}
void modify(int l, int r, int rt, int nowl, int nowr, int val)
{
if (nowl <= l && r <= nowr)
return (void)z[rt].color(val);
int mid = l + r >> 1;
push_down(rt);
if (nowl <= mid) modify(l, mid, rt << 1, nowl, nowr, val);
if (mid < nowr) modify(mid + 1, r, rt << 1 | 1, nowl, nowr, val);
z[rt] = z[rt << 1] + z[rt << 1 | 1];
}
int query(int l, int r, int rt, int nowl, int nowr)
{
if (nowl <= l && r <= nowr)
return z[rt].sum;
int mid = l + r >> 1, sum = 0;
push_down(rt);
if (nowl <= mid) sum += query(l, mid, rt << 1, nowl, nowr);
if (mid < nowr) sum += query(mid + 1, r, rt << 1 | 1, nowl, nowr);
return sum;
}
}
signed main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
int alloc = 0;
for (int i = 1; i <= n; i++)
if (a[i])
alloc++;
if (alloc)
{
memset(l, 0x3f, sizeof l);
for (int i = 1; i <= n; i++)
{
l[a[i]] = min(l[a[i]], i);
r[a[i]] = max(r[a[i]], i);
cnt[a[i]]++;
}
if (!cnt[m] && alloc == n) destroy;
Sgt1::build(1, n, 1);
for (int i = 1; i <= m; i++)
if (cnt[i] && Sgt1::query(1, n, 1, l[i], r[i]) < i)
destroy;
Sgt2::build(1, n, 1);
for (int i = 1; i <= m; i++)
if (cnt[i])
Sgt2::modify(1, n, 1, l[i], r[i], i);
for (int i = 1; i <= n; i++) a[i] = Sgt2::query(1, n, 1, i, i);
int p1 = -1, p2 = -1;
cout << "YES\n";
int pn = 0;
for (int i = 1; i <= n; i++)
if (!a[i])
pn++;
for (int i = 1; i <= n; i++)
if (!a[i] && !cnt[m] && pn)
{
a[i] = m;
break;
}
for (int i = 1; i <= n; i++)
if (a[i])
{
p1 = i;
break;
}
for (int i = n; i; i--)
if (a[i])
{
p2 = i;
break;
}
for (int i = 1; i < p1; i++) a[i] = a[p1];
for (int i = p2 + 1; i <= n; i++) a[i] = a[p2];
for (int i = 1; i <= n; i++)
if (!a[i])
{
if (i != n || !a[i + 1])
a[i] = a[i - 1];
else
a[i] = max(a[i - 1], a[i + 1]);
}
for (int i = 1; i <= n; i++) cout << a[i] << ' ';
cout << '\n';
}
else
{
cout << "YES\n";
for (int i = 1; i <= n; i++)
cout << m << ' ';
cout << '\n';
}
return 0;
}