class Solution {
public int[] loudAndRich(int[][] richer, int[] quiet) {
int n = quiet.length;
List<Integer>[] g = new List[n];
for (int i = 0; i < n; ++i) {
g[i] = new ArrayList<Integer>();
}
for (int[] r : richer) {
g[r[1]].add(r[0]);
}
int[] ans = new int[n];
Arrays.fill(ans, -1);
for (int i = 0; i < n; ++i) {
dfs(i, quiet, g, ans);
}
return ans;
}
public void dfs(int x, int[] quiet, List<Integer>[] g, int[] ans) {
if (ans[x] != -1) {
return;
}
ans[x] = x;
for (int y : g[x]) {
dfs(y, quiet, g, ans);
if (quiet[ans[y]] < quiet[ans[x]]) {
ans[x] = ans[y];
}
}
}
}