Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int n, a, chefe[100100]={}, salario[100100]={}, insatisfeitos=0;
- vector<int> subordinados[100100];
- priority_queue<pair<int, int>> maiors[100100];
- bool ins[100100]={};
- void dfs(int cur){
- for(int i=0; i<(int)subordinados[cur].size(); i++){
- int sub=subordinados[cur][i];
- if(sub==cur)continue;
- maiors[cur].push({salario[sub], sub});
- if(salario[sub]>salario[cur]){
- if(!ins[cur]){
- ins[cur]=1;
- insatisfeitos++;
- }
- }
- dfs(sub);
- }
- }
- void update(int cur){
- int ms=-1;
- while(!maiors[cur].empty()){
- ms=maiors[cur].top().first;
- int fun=maiors[cur].top().second;
- if(salario[fun]==ms){
- break;
- }
- maiors[cur].pop();
- if(maiors[cur].empty())ms=-1;
- }
- if(salario[cur]>=ms){
- if(ins[cur]){
- insatisfeitos--;
- ins[cur]=0;
- }
- }
- else{
- if(!ins[cur]){
- insatisfeitos++;
- ins[cur]=1;
- }
- }
- }
- int main(){
- ios_base::sync_with_stdio(0); cin.tie(0);
- cin >> n;
- for(int i=1; i<=n; i++){
- int c, s;
- cin >> c >> s;
- chefe[i]=c;
- salario[i]=s;
- subordinados[c].push_back(i);
- }
- dfs(1);
- cin >> a;
- cout << insatisfeitos << '\n';
- for(int i=0; i<a; i++){
- int fun, s;
- cin >> fun >> s;
- salario[fun]=s;
- maiors[chefe[fun]].push({salario[fun], fun});
- update(chefe[fun]);
- update(fun);
- cout << insatisfeitos << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement