// OBI 2023 - Fase 2 // Pequena Empresa - Solução O(N^2 + A * N) // Mateus Bezrutchka // #include #include #include using namespace std; const int MAXN = 2100; int n, a; int chefe[MAXN]; int salario[MAXN]; bool insatisfeito[MAXN]; int insatisfacao_atual; void calc_insatisfeito(int v) { insatisfeito[v] = false; for (int i = 1; i <= n; i++) { if (chefe[i] == v && salario[i] > salario[v]) { insatisfeito[v] = true; return; } } } void calc_insatisfacao_inicial() { insatisfacao_atual = 0; for (int i = 1; i <= n; i++) { calc_insatisfeito(i); if (insatisfeito[i]) insatisfacao_atual++; } } // apenas duas pessoas podem ter sido afetadas pela // mudança atual: o próprio funcionario i, e o chefe dele void atualiza_salario(int i, int val) { int c = chefe[i]; bool old_c_ins = insatisfeito[c]; bool old_i_ins = insatisfeito[i]; salario[i] = val; calc_insatisfeito(i); calc_insatisfeito(c); bool new_c_ins = insatisfeito[c]; bool new_i_ins = insatisfeito[i]; if (old_i_ins != new_i_ins) { insatisfacao_atual += (new_i_ins ? 1 : -1); } if (i != 1 && old_c_ins != new_c_ins) { insatisfacao_atual += (new_c_ins ? 1 : -1); } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d %d", &chefe[i], &salario[i]); } calc_insatisfacao_inicial(); printf("%d\n", insatisfacao_atual); scanf("%d", &a); while (a--) { int funcionario, novo_salario; scanf("%d %d", &funcionario, &novo_salario); atualiza_salario(funcionario, novo_salario); printf("%d\n", insatisfacao_atual); } return 0; }