#include <bits/stdc++.h>   using namespace std;   vector<pair<int, int>> tr;   int S(int n) {     int ans = 1;     while (ans < n) ans *= 2;     return ans;   }   int k;   void upd(int v) {     v += k;     tr[v].first--;     for (; v > 1; v >>= 1) {       tr[v >> 1] = max(tr[v], tr[v ^ 1]);     }   }   template <typename T>   inline T getint() {     T val = 0;     char c;     bool neg = false;     while ((c = getchar()) && !(c >=  0  && c <=  9 )) {       neg |= c ==  - ;     }     do {       val = (val * 10) + c -  0 ;     } while ((c = getchar()) && (c >=  0  && c <=  9 ));     return val * (neg ? -1 : 1);   }   inline void writeInt(int x) {     if (x < 0) putc( - , stdout), x = -x;     char s[20];     int n = 0;     while (x || !n) s[n++] =  0  + x % 10, x /= 10;     while (n--) putc(s[n], stdout);   }   int main() {     int t;     cin >> t;     while (t--) {       int n;       cin >> n;       int x, y;       cin >> x >> y;       vector<vector<int>> pos(n + 2);       vector<int> b(n);       tr.assign(10 * n, {0, 0});       for (int i = 0; i < n; i++) {         b[i] = getint<int>();         pos[b[i]].push_back(i);       }       int zn;       for (int i = 1; i < n + 2; i++) {         if (pos[i].empty()) {           zn = i;           break;         }       }       k = S(n + 1);       for (int i = 1; i < n + 2; i++) {         tr[k + i - 1] = {pos[i].size(), i};       }       for (int i = k - 1; i > 0; i--) {         tr[i] = max(tr[i * 2], tr[i * 2 + 1]);       }       vector<int> ans(n + 2);       int kol = x;       vector<int> h(n + 2);       vector<int> st;       while (kol--) {         ans[tr[1].second]++;         if (!h[tr[1].second]) st.push_back(tr[1].second);         h[tr[1].second]++;         upd(tr[1].second - 1);       }       kol = n - y;       int last = 0;       for (int i = 1; i <= kol; i++) {         if (2 * tr[1].first <= n - x - last) {           break;         }         ans[tr[1].second]++;         if (!h[tr[1].second]) st.push_back(tr[1].second);         h[tr[1].second]++;         upd(tr[1].second - 1);         last = i;       }       if (tr[1].first * 2 > n - x - last) {         cout <<  NO n ;         continue;       }       vector<int> a(n);       for (auto& ss : st) {         for (int i = 0; i < ans[ss]; i++) {           if (x) {             a[pos[ss][i]] = ss;             --x;           } else {             a[pos[ss][i]] = zn;           }         }       }       vector<vector<int>> npos(n + 2);       h.assign(n + 2, 0);       vector<int> s;       vector<int> cp;       for (int i = 0; i < n; i++) {         if (!a[i]) {           npos[b[i]].push_back(i);           cp.push_back(i);           h[b[i]]++;           if (h[b[i]] == 1) s.push_back(b[i]);         }       }       for (int i = 0; i < s.size(); i++) {         if (npos[s[i]].empty()) continue;         int uk = min(i + 1, (int)s.size() - 1);         for (int j = 0; j < npos[s[i]].size(); j++) {           if (npos[s[uk]].empty()) ++uk;           if (uk > s.size() - 1) break;           int p2 = npos[s[uk]].back();           a[npos[s[i]][j]] = b[p2];           a[p2] = b[npos[s[i]][j]];           npos[s[uk]].pop_back();         }       }       int col;       int uk = -1;       vector<int> cp2;       h.assign(n + 2, 0);       for (int i = 0; i < cp.size(); i++) {         if (!a[cp[i]] || a[cp[i]] == b[cp[i]]) {           h[cp[i]]++;           cp2.push_back(cp[i]);           a[cp[i]] = b[cp[i]];           if (uk == -1) {             col = a[cp[i]];             uk = i;           }         }       }       if (uk != -1) {         int i = 0;         for (int j = 0; j < cp2.size(); j++) {           for (;; i++) {             if (a[cp[i]] != col && !h[cp[i]] && b[cp[i]] != col) {               swap(a[cp[i]], a[cp2[j]]);               break;             }           }         }       }       kol -= last;       for (int i = 0; i < cp.size(); i++) {         if (kol) {           a[cp[i]] = zn;           --kol;         } else           break;       }       cout <<  Yes n ;       for (int i = 0; i < a.size(); i++) {         writeInt(a[i]);         cout <<    ;       }       cout <<   n ;     }   }