#include using namespace std; ifstream fin("star.in"); ofstream fout("star.out"); const int nmax = 1e4; const int mmax = 5e3; int n, m; int costOfActor[nmax + 5]; vector sceneActors[mmax + 5]; set actorScenes[nmax + 5]; vector orderOfScenes; int main() { ios::sync_with_stdio(0); cin.tie(0); fin >> n >> m; for (int i = 1; i <= n; ++i) { fin >> costOfActor[i]; } for (int i = 1; i <= m; ++i) { int sz; fin >> sz; sceneActors[i].resize(sz); for (auto& j : sceneActors[i]) { fin >> j; actorScenes[j].insert(i); } } // we sort the actors based on (number of scenes to be played) * (cost per hour) // we put in the first position all the scenes played by the cheapest actor // then we search the next cheapest actor set actorsLeft; for (int i = 1; i <= n; ++i) { actorsLeft.insert(i); } while (actorsLeft.size() > 0) { int bestActor = -1; for (auto& actor : actorsLeft) { if (bestActor == -1 || costOfActor[actor] * actorScenes[actor].size() < costOfActor[bestActor] * actorScenes[bestActor].size()) { bestActor = actor; } } //cout << "bestActor = " << bestActor << "\n"; for (auto& scene : actorScenes[bestActor]) { orderOfScenes.push_back(scene); //cout << "scene = " << scene << "\n"; for (auto& actor : sceneActors[scene]) { if (actor != bestActor) { actorScenes[actor].erase(scene); } } } actorScenes[bestActor].clear(); actorsLeft.erase(bestActor); } for (auto& scene : orderOfScenes) { fout << scene << " "; } }