#include <bits/stdc++.h>
namespace _ {
const int inf = 1e9 + 7;
const int mod = 1e9 + 7;
namespace _in {
template <class T>
inline T read() {
  char ch;
  bool flag = 0;
  T x = 0;
  while (ch = getchar(), !isdigit(ch))
    if (ch == '-') flag = 1;
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
  return flag ? -x : x;
}
struct {
  inline operator long long() { return read<long long>(); }
  inline operator int() { return read<int>(); }
  inline operator bool() { return read<bool>(); }
  template <class T>
  inline void operator()(T &x) {
    x = *this;
  }
  template <class T, class... A>
  inline void operator()(T &x, A &...a) {
    x = *this, this->operator()(a...);
  }
} IN;
}  // namespace _in
using namespace _in;
namespace _out {
char buf[1 << 23];
int p1 = -1;
const int p2 = (1 << 23) - 1;
void flush() { fwrite(buf, 1, p1 + 1, stdout), p1 = -1; }
void putc(const char &x) {
  if (p1 == p2) flush();
  buf[++p1] = x;
}
template <class T>
inline void print(T x) {
  static char tmp[15];
  static int len = -1;
  if (x >= 0) do {
      tmp[++len] = x % 10 + 48, x /= 10;
    } while (x);
  else {
    putc('-');
    do {
      tmp[++len] = -(x % 10) + 48, x /= 10;
    } while (x);
  }
  while (len >= 0) putc(tmp[len]), --len;
}
template <class T>
inline void print_(T x) {
  print(x), flush(), putchar(' ');
}
template <class T>
inline void _print(T x) {
  print(x), flush(), putchar('\n');
}
}  // namespace _out
using namespace _out;
namespace _std {
template <class T>
inline void swap(T &x, T &y) {
  x ^= y ^= x ^= y;
}
template <class T>
inline void chkmax(T &x, T y) {
  if (x < y) x = y;
}
template <class T>
inline void chkmin(T &x, T y) {
  if (x > y) x = y;
}
template <class T>
inline T abs(T x) {
  if (x < 0) x = -x;
  return x;
}
template <class T>
inline T max(T x, T y) {
  if (x < y) x = y;
  return x;
}
template <class T>
inline T min(T x, T y) {
  if (x > y) x = y;
  return x;
}
}  // namespace _std
using namespace _std;
namespace _mod {
inline int mul(int x, int y) { return 1ll * x * y % mod; }
inline int dec(int x, int y) {
  x -= y;
  if (x < 0) x += mod;
  return x;
}
inline int add(int x, int y) {
  x += y;
  if (x >= mod) x -= mod;
  return x;
}
inline void pls(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
}
inline void sub(int &x, int y) {
  x -= y;
  if (x < 0) x += mod;
}
inline int modpow(int x, int y, int res = 1) {
  for (; y; y >>= 1, x = mul(x, x))
    if (y & 1) res = mul(res, x);
  return res;
}
}  // namespace _mod
using namespace _mod;
}  // namespace _
using namespace _;
const int N = 2e5 + 5;
int n, m, x, y, fad, top, p[N], ans[N];
std::vector<int> hep[N];
std::priority_queue<std::pair<int, int> > que;
std::pair<int, int> sta[N];
int main() {
  int T = int(IN);
  while (T--) {
    IN(n, x, y), y -= x, m = n + 1;
    for (int i = 0; i <= m; ++i) hep[i].clear(), ans[i] = 0;
    while (!que.empty()) que.pop();
    for (int i = 1; i <= n; ++i) IN(p[i]), hep[p[i]].push_back(i);
    for (int i = 1; i <= m; ++i)
      if (!hep[i].size())
        fad = i;
      else
        que.push(std::make_pair(hep[i].size(), i));
    for (; x && que.size() >= 1;) {
      int i = que.top().second;
      que.pop();
      ans[hep[i].back()] = i, hep[i].pop_back(), --x;
      if (hep[i].size()) que.push(std::make_pair(hep[i].size(), i));
    }
    for (; y && que.size() >= 2 && que.top().first >= 2;) {
      int i = que.top().second, u = hep[i].back();
      hep[i].pop_back(), que.pop();
      int j = que.top().second, v = hep[j].back();
      hep[j].pop_back(), que.pop();
      if (y) ans[u] = j, --y;
      if (y) ans[v] = i, --y;
      if (hep[i].size()) que.push(std::make_pair(hep[i].size(), i));
      if (hep[j].size()) que.push(std::make_pair(hep[j].size(), j));
    }
    top = 0;
    while (!que.empty()) {
      int i = que.top().second;
      sta[++top] = std::make_pair(i, hep[i].back()), que.pop();
    }
    int lim = min(top, y);
    for (int i = 2; i <= top; ++i)
      if (y) ans[sta[i - 1].second] = sta[i].first, --y;
    if (y && top != 1) ans[sta[top].second] = sta[1].first, --y;
    if (!x && !y) {
      puts("YES");
      for (int i = 1; i <= n; ++i)
        if (!ans[i]) ans[i] = fad;
      for (int i = 1; i <= n; ++i) printf("%d ", ans[i]);
      puts("");
    } else
      puts("NO");
  }
  return 0;
}
