#include using namespace std; #define fwd(i, a, n) for (int i = (a); i < (n); i ++) #define rep(i, n) fwd(i, 0, n) #define all(X) begin(X), end(X) #define sz(X) ((int)X.size()) #define st first #define nd second #define pii pair #define vi vector #define ll long long #ifdef LOC auto &operator<<(auto &out, pair a) { return out << "(" << a.st << ", " << a.nd << ")"; } auto &operator<<(auto &out, auto a) { out << "{"; for (auto b : a) out << b << ", "; return out << "}"; } void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; } #define debug(x...) cerr << "[" #x "]: ", dump(x) #else #define debug(...) 0 #endif int a, b, c; vector> xs; using setnums = pair>>; using sets = array; void srt(sets &s) { sort(all(s), [](setnums &a, setnums &b) { return a.first < b.first; }); } void rem(setnums &s, pair id) { s.first -= id.first; s.second.erase(id); } void add(setnums &s, pair id) { s.first += id.first; s.second.insert(id); } sets getcase1() { sets st; int mn = min({a, b, c}); int mx = max({a, b, c}); int mid = a + b + c - mn - mx; rep(i, mn - 1) { add(st[0], xs[i]); } add(st[0], xs.back()); rep(i, mid) { add(st[1], xs[i + mn-1]); } rep(i, mx) { add(st[2], xs[i + mn-1+mid]); } return st; } sets getcase2() { sets st; int mn = min({a, b, c}); int mx = max({a, b, c}); int mid = a + b + c - mn - mx; rep(i, mn) { add(st[0], xs.rbegin()[i]); } rep(i, mid) { add(st[1], xs.rbegin()[i + mn]); } rep(i, mx) { add(st[2], xs.rbegin()[i + mn+mid]); } return st; } sets getcase3() { auto x = xs; static mt19937_64 rnd; shuffle(all(x), rnd); sets st; int mn = min({a, b, c}); int mx = max({a, b, c}); int mid = a + b + c - mn - mx; rep(i, mn) { add(st[0], x[i]); } rep(i, mid) { add(st[1], x[i + mn]); } rep(i, mx) { add(st[2], x[i + mn+mid]); } return st; } void op(sets &s) { srt(s); static mt19937_64 rnd; auto big = *s[2].second.rbegin(); int i = rnd()&1; auto sm = *s[i].second.begin(); add(s[i], big); add(s[2], sm); rem(s[i], sm); rem(s[2], big); } bool isok(sets &s) { srt(s); return s[0].first + s[1].first > s[2].first; } void print(sets &s) { cout << "YES\n"; if (sz(s[0].second) != a) swap(s[0], s[1]); if (sz(s[0].second) != a) swap(s[0], s[2]); if (sz(s[1].second) != b) swap(s[1], s[2]); for (auto [_, id] : s[0].second) cout << _ << ' '; cout << '\n'; for (auto [_, id] : s[1].second) cout << _ << ' '; cout << '\n'; for (auto [_, id] : s[2].second) cout << _ << ' '; cout << '\n'; } void solve() { int n; cin >> n >> a >> b >> c; xs.resize(n); rep(i, n) { ll t; cin >> t; xs[i] = {t, i}; } rep(caseid, 15) { debug(caseid); sets st; if (caseid < 5) st = getcase1(); else if (caseid < 10) st = getcase2(); else st = getcase3(); rep(_, n+1) { if (isok(st)) { print(st); return; } op(st); debug(st); } } cout << "NO\n"; } int32_t main() { ios_base::sync_with_stdio(0), cin.tie(0); int z; cin >> z; while (z--) solve(); return 0; }