#include <bits/stdc++.h>
using namespace std;
vector<int> ad[100009];
vector<int> idx;
deque<int> vec;
int cnt[100009];
int ans[100009];
vector<pair<int, int> > arr, arr2;
int val[100009];
set<int> s;
int main() {
  int a, b, c, d, e, i, j, k, l, n, m, x, y, t, p, X;
  scanf("%d", &t);
  for (p = 1; p <= t; p++) {
    scanf("%d%d%d", &n, &x, &y);
    c = y - x;
    m = n + 1;
    arr.clear();
    arr2.clear();
    for (i = 0; i <= m; i++) {
      cnt[i] = 0;
      ad[i].clear();
      ans[i] = -1;
    }
    s.clear();
    for (i = 1; i <= n; i++) {
      scanf("%d", &a);
      val[i] = a;
      cnt[a]++;
      ad[a].push_back(i);
      s.insert(i);
    }
    for (i = 1; i <= m; i++) {
      if (cnt[i] == 0) {
        X = i;
        break;
      }
    }
    if (c == 0) {
      for (i = 1; i <= n; i++) {
        if (x) {
          ans[i] = val[i];
          x--;
        } else {
          ans[i] = X;
        }
      }
      printf("YES\n");
      for (i = 1; i <= n; i++) {
        printf("%d ", ans[i]);
      }
      printf("\n");
      continue;
    }
    for (i = 1; i <= m; i++) {
      if (cnt[i] > 0) {
        arr.push_back({cnt[i], i});
      }
    }
    sort(arr.begin(), arr.end());
    m = arr.size();
    c = y - x;
    for (i = 0; i < m; i++) {
      if (c == 0) {
        break;
      }
      b = c / (m - i);
      if (c % (m - i) != 0) {
        b++;
      }
      b = min(b, arr[i].first);
      c -= b;
      arr2.push_back({b, arr[i].second});
    }
    sort(arr2.begin(), arr2.end());
    c = y - x;
    m = arr2.size();
    if (arr2[m - 1].first > (c - arr2[m - 1].first)) {
      l = arr2[m - 1].first - (c - arr2[m - 1].first);
      for (i = 0; i < m; i++) {
        a = arr2[i].second;
        b = arr2[i].first;
        for (j = 0; j < b; j++) {
          s.erase(ad[a][j]);
        }
      }
      a = arr2[m - 1].second;
      b = ad[a].size();
      for (j = 0; j < b; j++) {
        s.erase(ad[a][j]);
      }
      b = s.size();
      if (l > b) {
        printf("NO\n");
        continue;
      }
      arr2[m - 1].first -= l;
      a = arr2[m - 1].second;
      for (i = 0; i < l; i++) {
        d = *s.begin();
        s.erase(d);
        ans[d] = a;
      }
      b = arr2[m - 1].first;
      d = b + l;
      for (i = b; i < d; i++) {
        k = ad[a][i];
        ans[k] = X;
      }
    }
    vec.clear();
    idx.clear();
    for (i = 0; i < m; i++) {
      a = arr2[i].second;
      b = arr2[i].first;
      if (i == m - 1) {
        for (j = 0; j < b; j++) {
          vec.push_front(a);
        }
      } else {
        for (j = 0; j < b; j++) {
          vec.push_back(a);
        }
      }
      for (j = 0; j < b; j++) {
        idx.push_back(ad[a][j]);
      }
    }
    d = idx.size();
    for (i = 0; i < d; i++) {
      a = idx[i];
      ans[a] = vec[i];
    }
    for (i = 1; i <= n; i++) {
      if (ans[i] == -1) {
        if (x) {
          ans[i] = val[i];
          x--;
        } else {
          ans[i] = X;
        }
      }
    }
    if (x > 0) {
      printf("NO\n");
      continue;
    }
    printf("YES\n");
    for (i = 1; i <= n; i++) {
      printf("%d ", ans[i]);
    }
    printf("\n");
  }
}
