#include <bits/stdc++.h>
struct Element {
  int color, count;
  Element() {}
  Element(int color, int count) : color(color), count(count) {}
};
int a[100005];
int b[100005];
int vis[100005];
Element e[100005];
std::vector<int> offer[100005];
int min(int a, int b) { return a > b ? b : a; }
int max(int a, int b) { return a > b ? a : b; }
int isEnough(int n, int need, int upper) {
  int offer = 0;
  for (int i = 1; i <= n; i++) offer += min(upper, e[i].count);
  return offer >= need;
}
void doExchange(int u, int v) {
  offer[u].push_back(v);
  offer[v].push_back(u);
}
void getAnswer(int n) {
  if (n == 1) return;
  int t = n;
  for (int i = 1; i <= n; i++) {
    if (e[i].count == 0) break;
    if (t == i + 1) {
      int cnt = e[i].count;
      int u = e[i].color, v = e[i + 1].color;
      for (int j = 0; j < cnt; j++) doExchange(u, v);
      break;
    } else {
      while (e[i + 1].count != e[i + 2].count) {
        doExchange(e[i].color, e[i + 1].color);
        e[i].count--, e[i + 1].count--;
      }
      while (t != i + 2 && e[i].count != 0) {
        int minus = min(e[i].count, e[t].count);
        for (int j = 0; j < minus; j++) doExchange(e[i].color, e[t].color);
        e[i].count -= minus, e[t].count -= minus;
        if (e[t].count == 0) t--;
      }
      if (e[i].count != 0) {
        if (e[i].count % 2) {
          e[i].count--;
          offer[e[i].color].push_back(e[i + 2].color);
          offer[e[i + 1].color].push_back(e[i].color);
          offer[e[i + 2].color].push_back(e[i + 1].color);
          e[i + 1].count--, e[i + 2].count--;
        }
        int left = e[i].count / 2;
        for (int j = 0; j < left; j++) {
          doExchange(e[i].color, e[i + 1].color);
          doExchange(e[i].color, e[i + 2].color);
          e[i + 1].count--, e[i + 2].count--;
        }
      }
    }
  }
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    int n, x, y;
    scanf("%d%d%d", &n, &x, &y);
    for (int i = 1; i <= n + 1; i++) vis[i] = 0, offer[i].clear();
    for (int i = 1; i <= n; i++) {
      scanf("%d", &a[i]);
      b[i] = a[i];
      vis[b[i]] = 1;
    }
    std::sort(b + 1, b + 1 + n);
    int p = 1, size = 0;
    while (p <= n) {
      int np = p;
      while (np + 1 <= n && b[np + 1] == b[p]) np++;
      e[++size] = Element(b[p], np - p + 1);
      p = np + 1;
    }
    int need = n - x;
    int L = 0, R = n;
    int res = -1;
    while (L <= R) {
      int M = (L + R) / 2;
      if (isEnough(size, need, M)) {
        res = M;
        R = M - 1;
      } else
        L = M + 1;
    }
    int gap = res * 2 - need;
    if (n - y < gap)
      printf("NO\n");
    else {
      int left = need;
      for (int i = 1; i <= size; i++) {
        e[i].count = min(res, min(left, e[i].count));
        left -= e[i].count;
      }
      int extra = -1;
      for (int i = 1; i <= n + 1; i++)
        if (!vis[i]) extra = i;
      int extraCnt = n - y;
      e[++size] = Element(extra, extraCnt);
      std::sort(e + 1, e + 1 + size,
                [&](Element u, Element v) { return u.count > v.count; });
      getAnswer(size);
      printf("YES\n");
      int good = x;
      for (int i = 1; i <= n; i++) {
        int u = a[i];
        if (offer[u].size() != 0) {
          int coco = offer[u][offer[u].size() - 1];
          offer[u].pop_back();
          printf("%d ", coco);
        } else {
          if (good)
            printf("%d ", u), good--;
          else
            printf("%d ", extra);
        }
      }
      printf("\n");
    }
  }
  return 0;
}
