#include #include #include #include #include #include #include #include using namespace std; struct Clerk { set addsMarks; set erases; set distributesTo; set logbook; bool firstTime; }; struct Event { int clerkNum; set form; Event (int clerk, const set& aForm) : clerkNum(clerk), form(aForm) {} }; istream& operator>> (istream& in, set& s) { string line; getline(in, line); s.clear(); istringstream lineIn (line); copy (istream_iterator(lineIn), istream_iterator(), inserter(s, s.end())); return in; } ostream& operator<< (ostream& out, const set& s) { bool firstTime = true; for (set::const_iterator p = s.begin(); p != s.end(); ++p) { if (!firstTime) out << ' '; out << *p; firstTime = false; } return out; } int main () { int numMarks, numClerks; string dummy; cin >> numMarks >> numClerks; while (numMarks > 0 && numClerks > 0) { getline(cin,dummy); Clerk* clerks = new Clerk[numClerks]; for (int i = 0; i < numClerks; ++i) { cin >> clerks[i].addsMarks >> clerks[i].erases >> clerks[i].distributesTo; clerks[i].firstTime = true; } queue q; q.push (Event(0,set())); while (!q.empty()) { Event event = q.front(); q.pop(); set form = event.form; Clerk& clerk = clerks[event.clerkNum]; copy (clerk.logbook.begin(), clerk.logbook.end(), inserter(form, form.end())); copy (clerk.addsMarks.begin(), clerk.addsMarks.end(), inserter(form, form.end())); set erasedForm; set_difference (form.begin(), form.end(), clerk.erases.begin(), clerk.erases.end(), inserter(erasedForm, erasedForm.end())); if (clerk.firstTime || erasedForm != clerk.logbook) { clerk.firstTime = false; copy (erasedForm.begin(), erasedForm.end(), inserter(clerk.logbook, clerk.logbook.end())); for (set::iterator p = clerk.distributesTo.begin(); p != clerk.distributesTo.end(); ++p) { q.push (Event(*p, erasedForm)); } cerr << "clerk " << event.clerkNum << " sends " << erasedForm << endl; } } cout << clerks[0].logbook << endl; cin >> numMarks >> numClerks; } return 0; }