#ifdef NACHIA #define _GLIBCXX_DEBUG #else // disable assert #define NDEBUG #endif #include #include #include #include #include using namespace std; using ll = long long; const ll INF = 1ll << 60; #define REP(i,n) for(ll i=0; i using V = vector; template void chmax(A& l, const B& r){ if(l < r) l = r; } template void chmin(A& l, const B& r){ if(r < l) l = r; } V> diffs; #define ENUM_REP(i) for(ll i=-2; i<=2; i++) void enum_diff(){ ENUM_REP(a) ENUM_REP(b) ENUM_REP(c) ENUM_REP(ab) ENUM_REP(bc) ENUM_REP(ca){ if(a+b+c+ab+bc+ca != 1) continue; if((a < 0 || b < 0) && ab > 0) continue; if((b < 0 || c < 0) && bc > 0) continue; if((c < 0 || a < 0) && ca > 0) continue; diffs.push_back({ a, b, c, ab, ca, bc, a+ab+ca, b+ab+bc, c+ca+bc }); } } void testcase(){ ll N, A, B, C; cin >> N >> A >> B >> C; array, 6> score; REP(i,N){ ll t,v; cin >> t >> v; t--; score[t].push_back(v); } ll semiINF = INF / 10; REP(t,6){ sort(score[t].rbegin(), score[t].rend()); V sum; REP(i,2) sum.push_back(-semiINF); sum.push_back(0); for(auto a : score[t]) sum.push_back(sum.back() + a); REP(i,2) sum.push_back(-semiINF); swap(score[t], sum); } // REP(t,6){ for(auto a : score[t]) cout << a << " "; cout << endl; } V ans; array p; p.fill(0); REP(i,6) p[i] = 2; while(1){ ll maxans = -INF; ll argmax = -1; REP(i,diffs.size()){ if(p[6] + diffs[i][6] > A) continue; if(p[7] + diffs[i][7] > B) continue; if(p[8] + diffs[i][8] > C) continue; ll c = 0; REP(t,6) c += score[t][p[t] + diffs[i][t]]; if(maxans < c){ maxans = c; argmax = i; } } // cout << "maxans = " << maxans << " , argmax = "; REP(i,6) cout << diffs[argmax][i] << " "; cout << endl; if(maxans < -semiINF / 3) break; ans.push_back(maxans); REP(t,9) p[t] += diffs[argmax][t]; } cout << ans.size(); REP(i,ans.size()){ cout << " " << ans[i]; } cout << "\n"; } int main(){ cin.tie(0)->sync_with_stdio(0); enum_diff(); // cout << diffs.size() << endl; ll T; cin >> T; REP(t,T) testcase(); return 0; }