// OBI 2023 - Fase 2 // Startup - Solução O(N + A) com manipulação de listas e vetores // Mateus Bezrutchka // var n; scanf("%d", "n"); var chefe = Array(n); var salario = Array(n); for (var i = 0; i < n; i++) { scanf("%d %d", "chefe[i]", "salario[i]"); chefe[i]--; // estou indexando do 0 } var subordinados = Array(n); // conta quantos subordinados diretos tem salário maior que ele no momento var insat_cnt = Array(n); var insatisfacao_atual = 0; // init for (var i = 0; i < n; i++) { subordinados[i] = Array(0); insat_cnt[i] = 0; } for (var i = 1; i < n; i++) { subordinados[chefe[i]].push(i); } // Chamada no máximo 2 vezes (início e ajuste dele) para cada i function calc_insat_cnt(i) { insat_cnt[i] = 0; subordinados[i].forEach(j => { if (salario[j] > salario[i]) insat_cnt[i]++; }); } // calcula insatisfação inicial for (var i = 0; i < n; i++) { calc_insat_cnt(i); if (insat_cnt[i] > 0) insatisfacao_atual++; } printf("%d\n", insatisfacao_atual); // apenas duas pessoas podem ter sido afetadas pela // mudança atual: o próprio funcionario i, e o chefe dele function atualiza_salario(i, val) { // atualiza contador do chefe if (i != 0) { var c = chefe[i]; if (salario[i] <= salario[c] && val > salario[c]) { insat_cnt[c]++; if (insat_cnt[c] == 1) insatisfacao_atual++; // acabou de ficar insatisfeito } else if (salario[i] > salario[c] && val <= salario[c]) { insat_cnt[c]--; if (insat_cnt[c] == 0) insatisfacao_atual--; // acabou de ficar satisfeito } } salario[i] = val; // atualiza contador do i var old_cnt = insat_cnt[i]; calc_insat_cnt(i); var new_cnt = insat_cnt[i]; if (old_cnt == 0 && new_cnt > 0) { insatisfacao_atual++; } else if (old_cnt > 0 && new_cnt == 0) { insatisfacao_atual--; } } var a; scanf("%d", "a"); for (var i = 0; i < a; i++) { var funcionario; var novo_salario; scanf("%d %d", "funcionario", "novo_salario"); funcionario--; atualiza_salario(funcionario, novo_salario); printf("%d\n", insatisfacao_atual); }