#include #define MAX 1002 #define lli long long using namespace std; lli A[MAX]; lli X[MAX]; int K[MAX]; bool vis[MAX]; string iff[MAX]; int main() { int t, n, m, candidates, company, companies; lli sum; cin >> t; assert(t >= 1 && t <= 10); while ( t-- ) { cin >> n >> m; assert(n >= 1 && n <= 1000); assert(m >= 1 && m <= 1000); sum = candidates = 0; for ( int i = 0; i < n; i++ ) { cin >> A[i]; assert(A[i] >= 0 && A[i] <= 1000000000); } for ( int i = 0; i < m; i++ ) { vis[i] = false; cin >> X[i] >> K[i]; assert(X[i] >= 1 && X[i] <= 1000000000); assert(K[i] >= 1 && K[i] <= 1000000); } for ( int i = 0; i < n; i++ ) { cin >> iff[i]; assert((int)iff[i].size() == m); for ( int j = 0; j < m; j++ ) { assert(iff[i][j] == '0' || iff[i][j] == '1'); } } for ( int i = 0; i < n; i++ ) { company = -1; for ( int j = 0; j < m; j++ ) { if ( iff[i][j] == '0' ) continue; if ( K[j] > 0 && X[j] >= A[i] ) { if ( company == -1 || X[j] > X[company] ) { company = j; } } } if ( company != -1 ) { vis[company] = true; K[company]--; sum += X[company]; candidates++; } } companies = 0; for ( int i = 0; i < m; i++ ) { if ( !vis[i] ) companies++; } cout << candidates << " " << sum << " " << companies << endl; } return 0; }