#include #include using namespace std; int main() { int n; scanf("%d\n", &n); int *time = new int[n]; int *wait = new int[n] {}; int *kahn_table = new int[n]; vector> dependency(n); // Stores the graph vector next; // Stores nodes that have no more dependencies int x; for (int i = 0; i != n; ++i) { scanf("%d %d", time + i, kahn_table + i); if (!kahn_table[i]) next.push_back(i); // Initial set of nodes for (int j = kahn_table[i]; j; --j) { scanf("%d", &x); dependency[x].push_back(i); } } int node; while (!next.empty()) { // Remove any node from the set node = next.back(); next.pop_back(); time[node] += wait[node]; // Remove the edges of the node for (auto iter = dependency[node].begin(), end = dependency[node].end(); iter != end; ++iter) { --kahn_table[*iter]; // Decrement dependency count if (wait[*iter] < time[node]) wait[*iter] = time[node]; if (!kahn_table[*iter]) next.push_back(*iter); // If no more dependency, add to the set } } for (int i = 0; i != n; ++i) printf("%d\n", time[i]); }