#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct shu {
  int val;
  int sam;
  int pos;
  int cor;
} a[N];
int ji[N];
int unuse[N];
int cmp1(shu x1, shu x2) { return x1.val < x2.val; }
int cmp2(shu x1, shu x2) { return x1.sam > x2.sam; }
int cmp3(shu x1, shu x2) { return x1.pos < x2.pos; }
int n, x, y;
void print() {
  sort(a, a + n, cmp3);
  printf("YES\n");
  for (int i = 0; i < n; i++) {
    printf("%d ", a[i].cor);
  }
  printf("\n");
}
void rlmn() {
  scanf("%d%d%d", &n, &x, &y);
  for (int i = 0; i <= n + 1; i++) {
    ji[i] = 0;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i].val);
    a[i].pos = i;
    a[i].sam = 1;
    a[i].cor = -1;
    ji[a[i].val] = 1;
  }
  int tmp = 0;
  for (int i = 1; i <= n + 1; i++) {
    if (ji[i] == 0) {
      unuse[tmp++] = i;
    }
  }
  sort(a, a + n, cmp1);
  for (int i = 1; i < n; i++) {
    if (a[i].val == a[i - 1].val) {
      a[i].sam = a[i - 1].sam + 1;
    }
  }
  sort(a, a + n, cmp2);
  tmp = n - y;
  int num;
  int len;
  int flag = 0;
  for (int i = 0; i < n; i++) {
    if (x > 0) {
      a[i].cor = a[i].val;
      x--;
      continue;
    }
    if (n - i + n - y < 2 * a[i].sam) {
      printf("NO\n");
      return;
    }
    num = i;
    len = n - i;
    break;
  }
  sort(a + num, a + n, cmp1);
  for (int i = num; i < n; i++) {
    if (i + len / 2 < n)
      a[i].cor = a[(i + len / 2)].val;
    else
      a[i].cor = a[(i + len / 2 + num - n)].val;
  }
  tmp = n - y;
  for (int i = num; i < n; i++) {
    if (a[i].cor == a[i].val) {
      a[i].cor = unuse[0];
      tmp--;
    }
  }
  for (int i = num; i < n; i++) {
    if (tmp > 0 && a[i].cor != unuse[0]) {
      a[i].cor = unuse[0];
      tmp--;
    }
  }
  print();
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) rlmn();
  return 0;
}
