#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
using ll = long long;
using ull = unsigned long long;
using P = pair<ll, ll>;
constexpr long double PI = 3.14159265358979323846264338327950288L;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
class CMastermind {
 public:
  void calc(istream& cin, ostream& cout) {
    int n, x, y;
    cin >> n >> x >> y;
    vector<int> b(n);
    vector<bool> used(n + 2);
    for (int i = 0; i < (int)(n); i++) {
      cin >> b[i];
      used[b[i]] = true;
    }
    int unused = -1;
    for (int i = 1; i <= n + 1; i++) {
      if (!used[i]) {
        unused = i;
        break;
      }
    }
    if (x == y) {
      vector<int> a(n);
      for (int i = 0; i < x; i++) {
        a[i] = b[i];
      }
      for (int i = x; i < n; i++) {
        a[i] = unused;
      }
      cout << "YES" << '\n';
      for (auto e : a) {
        cout << e << ' ';
      }
      cout << '\n';
      return;
    }
    vector<int> pos[n + 2];
    for (int i = 0; i < n; i++) {
      pos[b[i]].push_back(i);
    }
    priority_queue<P> que;
    for (int i = 1; i <= n + 1; i++) {
      if (!pos[i].empty()) {
        que.emplace(pos[i].size(), i);
      }
    }
    int maxcnt = 0;
    for (int i = 1; i <= n + 1; i++) {
      chmax(maxcnt, (int)pos[i].size());
    }
    int remaining = n;
    vector<int> a(n);
    for (int i = 0; i < x; i++) {
      auto pa = que.top();
      que.pop();
      int p = pa.second;
      int idx = pos[p].size() - pa.first;
      a[pos[p][idx]] = b[pos[p][idx]];
      remaining--;
      if (pa.first > 1) {
        que.emplace(pa.first - 1, pa.second);
      }
    }
    int z = n - y;
    remaining -= z;
    while (remaining > 0) {
      if (remaining > 3 || remaining == 2 || (z > 0 && remaining == 3)) {
        if (que.size() < 2) {
          cout << "NO" << '\n';
          return;
        }
        auto p1 = que.top();
        que.pop();
        auto p2 = que.top();
        que.pop();
        int idx1 = pos[p1.second].size() - p1.first;
        int idx2 = pos[p2.second].size() - p2.first;
        int pos1 = pos[p1.second][idx1];
        int pos2 = pos[p2.second][idx2];
        a[pos1] = b[pos2];
        a[pos2] = b[pos1];
        remaining -= 2;
        if (p1.first > 1) {
          que.emplace(p1.first - 1, p1.second);
        }
        if (p2.first > 1) {
          que.emplace(p2.first - 1, p2.second);
        }
      } else if (remaining == 3) {
        if (que.size() < 3) {
          cout << "NO" << '\n';
          return;
        }
        auto p1 = que.top();
        que.pop();
        auto p2 = que.top();
        que.pop();
        auto p3 = que.top();
        que.pop();
        int idx1 = pos[p1.second].size() - p1.first;
        int idx2 = pos[p2.second].size() - p2.first;
        int idx3 = pos[p3.second].size() - p3.first;
        int pos1 = pos[p1.second][idx1];
        int pos2 = pos[p2.second][idx2];
        int pos3 = pos[p3.second][idx3];
        a[pos1] = b[pos2];
        a[pos2] = b[pos3];
        a[pos3] = b[pos1];
        remaining -= 3;
        if (p1.first > 1) {
          que.emplace(p1.first - 1, p1.second);
        }
        if (p2.first > 1) {
          que.emplace(p2.first - 1, p2.second);
        }
        if (p3.first > 1) {
          que.emplace(p3.first - 1, p3.second);
        }
      } else if (remaining == 1) {
        if (que.size() < 2 || z == 0) {
          cout << "NO" << '\n';
          return;
        }
        auto p1 = que.top();
        que.pop();
        auto p2 = que.top();
        int idx1 = pos[p1.second].size() - p1.first;
        int idx2 = pos[p2.second].size() - p2.first;
        int pos1 = pos[p1.second][idx1];
        int pos2 = pos[p2.second][idx2];
        a[pos1] = b[pos2];
        remaining -= 1;
        if (p1.first > 1) {
          que.emplace(p1.first - 1, p1.second);
        }
      }
    }
    for (int i = 0; i < n; i++) {
    }
    for (int i = 0; i < z; i++) {
      auto pa = que.top();
      que.pop();
      int p = pa.second;
      int idx = pos[p].size() - pa.first;
      a[pos[p][idx]] = unused;
      remaining--;
      if (pa.first > 1) {
        que.emplace(pa.first - 1, pa.second);
      }
    }
    cout << "YES" << '\n';
    for (auto e : a) {
      cout << e << ' ';
    }
    cout << '\n';
  }
  void solve(istream& cin, ostream& cout) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
      calc(cin, cout);
    }
  }
};
signed main() {
  CMastermind solver;
  std::istream& in(std::cin);
  std::ostream& out(std::cout);
  solver.solve(in, out);
  return 0;
}
