#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //#pragma comment(linker,"/STACK:102400000,102400000") int nPeople, nType, eachTimeCooking, spendTime; int qByType[1001][10001]; int qByTypeNow[1001]; int qByTypeZ[1001]; bool finished[1001]; int finishTime[1001]; int need[1001], needType[1001]; int beginTime[1001]; int nextAdd; int parse(string s) { int hh = (s[0] - '0') * 10 + (s[1] - '0'); int mm = (s[3] - '0') * 10 + (s[4] - '0'); return hh * 60 + mm; } void addToQueue(int id) { int typeID = needType[id]; qByTypeZ[typeID] ++; qByType[typeID][qByTypeZ[typeID]] = id; } int findMaxNumber(int typeID) { int s = 0; //cout << "! " << typeID << " : " << qByTypeNow[typeID] << " ~ " << qByTypeZ[typeID] << endl; for(int i = qByTypeNow[typeID]; i <= qByTypeZ[typeID]; i++) { int id = qByType[typeID][i]; s += need[id]; if(s >= eachTimeCooking) { return eachTimeCooking; } } return s; } void cooking(int id, int timeBegin) { int number = findMaxNumber(needType[id]); int typeID = needType[id]; //cout << id << " " << timeBegin << " : " << number << endl; for(int i = qByTypeNow[typeID]; i <= qByTypeZ[typeID]; i++) { int id2 = qByType[typeID][i]; int cook = min(number, need[id2]); need[id2] -= cook; number -= cook; if(need[id2] == 0) { finished[id2] = true; qByTypeNow[typeID] ++; finishTime[id2] = timeBegin + spendTime; } if(number == 0) break; } } int MAIN() { int T; cin >> T; while(T--) { cin >> nType >> spendTime >> eachTimeCooking >> nPeople; for(int i = 1; i <= nPeople; i++) { string s; cin >> s; beginTime[i] = parse(s); cin >> needType[i] >> need[i]; } int t = 0; int p = 1; nextAdd = 1; memset(finished, 0, sizeof(finished)); for(int i = 1; i <= nType; i++) { qByTypeZ[i] = 0; qByTypeNow[i] = 1; } while(true) { if(p > nPeople) break; while(nextAdd <= nPeople && t >= beginTime[nextAdd]) { addToQueue(nextAdd); nextAdd ++; } while(p < nextAdd && finished[p] == true) p ++; if(p > nPeople) break; if(p >= nextAdd) { addToQueue(nextAdd); t = beginTime[nextAdd]; nextAdd ++; } cooking(p, t); t += spendTime; } for(int i = 1; i <= nPeople; i++) { int t = finishTime[i]; t %= 24 * 60; int hh = t / 60; int mm = t % 60; if(hh < 10) cout << "0"; cout << hh; cout << ":"; if(mm < 10) cout << "0"; cout << mm; cout << endl; } if(T > 0) cout << endl; } return 0; } int main() { #ifdef LOCAL_TEST freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif ios :: sync_with_stdio(false); cout << fixed << setprecision(16); return MAIN(); }