#include /** Ideia: Armazenar um multiset com o peso de todos os filhos de cada vertice. Podemos usar o .begin() com um comparator diferente para pegar o filho mais pesado A update pode alterar apenas a resposta do pai ou do proprio vertice Entao temos que recalcular apenas esses dois **/ #define MAX 105000 std::multiset> pesos[MAX]; int resposta=0,valor_anterior[MAX],peso_atual[MAX],pai[MAX]; int atualiza(int x){///Atualiza a resposta do vertice x: ela continua igual ou mudou? int prev = valor_anterior[x]; int novo = 0;///Qual a resposta do vertice x? A resposta eh 1 ou 0? if(pesos[x].size()){ if(*pesos[x].begin()>peso_atual[x]){ novo=1; } } resposta+=novo-prev; valor_anterior[x]=novo; } void muda(int S,int K){///Atualiza o multiset do pai e recalcula ambos pesos[pai[S]].erase(peso_atual[S]); peso_atual[S]=K; pesos[pai[S]].insert(peso_atual[S]); atualiza(S); atualiza(pai[S]); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int N; std::cin>>N; for(int i=0;i!=N;++i){ int a,b; std::cin>>a>>b;--a; pai[i]=a; peso_atual[i]=b; pesos[pai[i]].insert(b); } for(int i=0;i!=N;++i){ atualiza(i); } std::cout<>Q; for(int i=0;i!=Q;++i){ int a,b; std::cin>>a>>b; --a; muda(a,b); std::cout<