#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int n, m; int a[100005], ans[100005]; bool topological_sort(vector>& g){ vector indeg(m); for(int i = 0; i < m; ++i){ for(int j : g[i]) indeg[j] += 1; } queue que; for(int i = 0; i < m; ++i){ if(indeg[i] == 0) que.emplace(i); } vector vs; while(!que.empty()){ int u = que.front(); que.pop(); vs.emplace_back(u); for(int v : g[u]){ if(--indeg[v] == 0) que.emplace(v); } } if(vs.size() != m) return false; for(int i = 0; i < m; ++i){ ans[vs[i]] = i + 1; } return true; } void output(){ cout << "Yes\n"; for(int i = 0; i < m; ++i){ cout << ans[i] << (i == m - 1 ? '\n': ' '); } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for(int i = 0; i < n; ++i){ cin >> a[i]; --a[i]; } for(int i = 0; i + 2 < n; ++i){ if(a[i] == a[i + 1] || a[i + 1] == a[i + 2] || a[i + 2] == a[i]){ cout << "No\n"; return 0; } } vector> g(m); for(int i = 0; i < n; i += 2){ if(i - 1 >= 0){ g[a[i]].emplace_back(a[i - 1]); } if(i + 1 < n){ g[a[i]].emplace_back(a[i + 1]); } } if(topological_sort(g)){ output(); return 0; } vector> g2(m); for(int i = 1; i < n; i += 2){ g2[a[i]].emplace_back(a[i - 1]); if(i + 1 < n){ g2[a[i]].emplace_back(a[i + 1]); } } if(topological_sort(g2)) output(); else cout << "No\n"; return 0; }