#include #include #include #include #include #include using namespace std; struct menu_t { string name; int limit, time; }; vector menu; struct order_t { int T; int menu_index; const bool operator<(const order_t &o) const { if (T != o.T) { return T < o.T; } if (menu[menu_index].time != menu[o.menu_index].time) { return menu[menu_index].time > menu[o.menu_index].time; } return menu_index < o.menu_index; } bool cooked; }; int main() { int N, M; bool first = true; while (true) { map menu_dictionary; map finished; vector order; menu.clear(); cin >> N >> M; if (N == 0 && M == 0) { break; } for (int i = 0; i < N; i++) { menu_t x; cin >> x.name >> x.limit >> x.time; menu.push_back(x); menu_dictionary.insert(make_pair(x.name, i)); } for (int i = 0; i < M; i++) { int T, K; cin >> T >> K; for (int j = 0; j < K; j++) { string menu_name; cin >> menu_name; int menu_index; menu_index = menu_dictionary[menu_name]; order_t x; x.T = T; x.menu_index = menu_index; x.cooked = false; order.push_back(x); } } sort(order.begin(), order.end()); /* for (int i = 0; i < order.size(); i++) { cout << order[i].T << ":" << menu[order[i].menu_index].name << "(" << order[i].menu_index << ")" << endl; } */ int tm = 0; int limit; for (int i = 0; i < order.size(); i++) { if (order[i].cooked) { continue; } // cout << ">" << i << endl; if (tm < order[i].T) { tm = order[i].T; } limit = menu[order[i].menu_index].limit; int n_cooked = 0; for (int j = i; j < order.size(); j++) { if (tm < order[j].T || n_cooked >= limit) { break; } if (order[i].menu_index == order[j].menu_index) { // cout << ">>>" << j << endl; order[j].cooked = true; n_cooked++; finished[order[j].T /* means order id */] = tm + menu[order[j].menu_index].time; } } tm += menu[order[i].menu_index].time; } if (!first) { cout << endl; } else { first = false; } for (map::iterator p = finished.begin(); p != finished.end(); p++) { cout << p->second << endl; } } return 0; }