#include <bits/stdc++.h>
#pragma comment(linker, "/stack:512000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
mt19937_64 gen(time(nullptr));
struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};
ll mod = 1e9 + 7;
namespace {
ll mul(ll a, ll b) {
  ll val = a * b - (ll)((ld)a * b / mod) * mod;
  if (val < 0) val += mod;
  if (val >= mod) val -= mod;
  return val;
}
ll poww(ll a, ll b) {
  ll val = 1;
  a %= mod;
  while (b > 0) {
    if (b % 2) val = mul(a, val);
    a = mul(a, a);
    b >>= 1;
  }
  return val % mod;
}
ll inv(ll a) { return poww(a, mod - 2); }
ll gcd(ll a, ll b) { return (a == 0 ? b : gcd(b % a, a)); }
ll gcdex(ll a, ll b, ll& x, ll& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  ll x1, y1;
  ll d = gcdex(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
ll inv_eu(ll a, ll m) {
  ll x, y;
  ll g = gcdex(a, m, x, y);
  if (g != 1)
    assert(0);
  else {
    x = (x % m + m) % m;
    return x;
  }
}
}  // namespace
ll const maxn = 3e5 + 5;
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ll q;
  cin >> q;
  while (q--) {
    ll n, x, y;
    cin >> n >> x >> y;
    vector<ll> cnt(n + 2);
    vector<ll> b(n);
    for (ll i = 0; i < n; i++) cin >> b[i], cnt[b[i]]++;
    ll extra = 0;
    for (ll i = 1; i <= n + 1; i++)
      if (cnt[i] == 0) extra = i;
    assert(extra);
    ll yy = y - x, nn = n - x;
    ll kek = 2 * nn - yy;
    kek /= 2;
    ll rofl = 0;
    vector<ll> cnt1(n + 2);
    for (ll i = 1; i <= n + 1; i++) {
      ll ost = nn - rofl;
      ll cc = min({ost, kek, cnt[i]});
      cnt[i] -= cc;
      cnt1[i] += cc;
      rofl += cc;
    }
    if (rofl < nn) {
      cout << "NO\n";
      continue;
    }
    assert(rofl == nn);
    vector<vector<ll>> g(n + 2);
    auto gg = g;
    vector<ll> roflan;
    for (ll i = 1; i <= n + 1; i++) {
      if (cnt1[i]) roflan.push_back(i);
    }
    sort(roflan.begin(), roflan.end(),
         [&](ll i, ll j) { return cnt1[i] > cnt1[j]; });
    vector<ll> kek0, kek1;
    for (ll i = 0; i < roflan.size(); i++) {
      for (ll j = 0; j < cnt1[roflan[i]]; j++) {
        kek0.push_back(roflan[i]);
      }
    }
    kek1.resize(kek0.size());
    assert(kek0.size() == nn);
    for (ll i = 0; i < kek0.size(); i++) {
      ll j = i + cnt1[roflan[0]];
      kek1[j % kek1.size()] = kek0[i];
    }
    for (ll i = 0; i < kek0.size(); i++) {
      if (kek1[i] == kek0[i]) {
        kek1[i] = extra;
      }
    }
    ll zz = 0;
    vector<ll> cnt2(n + 2);
    for (ll i = 0; i < kek0.size(); i++) {
      if (cnt2[kek1[i]] + 1 <= cnt1[kek1[i]]) {
        if (zz + 1 > yy)
          kek1[i] = extra;
        else {
          zz++;
          cnt2[kek1[i]]++;
        }
      }
    }
    for (ll i = 0; i < kek0.size(); i++) {
      g[kek0[i]].push_back(kek1[i]);
    }
    for (ll i = 1; i <= n + 1; i++) {
      for (ll j = 0; j < cnt[i]; j++) {
        gg[i].push_back(i);
      }
    }
    vector<ll> a(n);
    for (ll i = 0; i < n; i++) {
      if (gg[b[i]].size())
        a[i] = gg[b[i]].back(), gg[b[i]].pop_back();
      else {
        assert(g[b[i]].size());
        a[i] = g[b[i]].back(), g[b[i]].pop_back();
      }
    }
    cout << "YES\n";
    for (ll i = 0; i < n; i++) {
      cout << a[i] << " ";
    }
    cout << "\n";
  }
  return 0;
}
