#! /usr/bin/env python3 # OBI 2023 - Fase 2 # Startup - Solução O(N + A) com manipulação de listas e vetores # Mateus Bezrutchka def read_int(): return int(input()) def read_int_list(): return [int(x) for x in input().split()] n = read_int() chefe = [] salario = [] for i in range(n): [c, sal] = read_int_list() salario.append(sal) chefe.append(c - 1) # estou indexando do zero subordinados = [[] for i in range(n)] # conta quantos subordinados diretos tem salário maior que ele no momento insat_cnt = [0 for i in range(n)] insatisfacao_atual = 0 # mantém a resposta # Chamada no máximo 2 vezes (início e ajuste dele) para cada i def calc_insat_cnt(i): insat_cnt[i] = 0 for sub in subordinados[i]: if salario[sub] > salario[i]: insat_cnt[i] += 1 def calc_insatisfacao_inicial(): global insatisfacao_atual for i in range(1, n): subordinados[chefe[i]].append(i) insatisfacao_atual = 0 for i in range(n): calc_insat_cnt(i) if insat_cnt[i] > 0: insatisfacao_atual += 1 # apenas duas pessoas podem ter sido afetadas pela # mudança atual: o próprio funcionario i, e o chefe dele def atualiza_salario(i, val): global insatisfacao_atual if i != 0: # atualiza contador do chefe c = chefe[i] if salario[i] <= salario[c] and val > salario[c]: insat_cnt[c] += 1 if insat_cnt[c] == 1: # acabou de ficar insatisfeito insatisfacao_atual += 1 elif salario[i] > salario[c] and val <= salario[c]: insat_cnt[c] -= 1 if insat_cnt[c] == 0: # acabou de ficar satisfeito insatisfacao_atual -= 1 salario[i] = val # recalcula insatisfação do i e atualiza contadores old_cnt = insat_cnt[i] calc_insat_cnt(i) new_cnt = insat_cnt[i] if old_cnt == 0 and new_cnt > 0: insatisfacao_atual += 1 elif old_cnt > 0 and new_cnt == 0: insatisfacao_atual -= 1 # calcula e imprime respostas calc_insatisfacao_inicial() print(insatisfacao_atual) a = read_int() for i in range(a): [funcionario, novo_salario] = read_int_list() funcionario -= 1 atualiza_salario(funcionario, novo_salario) print(insatisfacao_atual)