Pagini recente » Cod sursa (job #1727063) | Cod sursa (job #2711144) | Cod sursa (job #2779727) | Cod sursa (job #2117177) | Cod sursa (job #3129497)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
vector<int> p;
vector<int> k;
vector<int> ans;
vector<int> kID;
void ShowPQ(priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq){
for(; !pq.empty(); pq.pop())
cout << pq.top().first << " " << pq.top().second+1 << "\n";
cout << "\n";
}
void GetAns(int s, priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> &pq, int t){
//cout << s+1 << "\n";
//ShowPQ(pq);
if(k[s] == 0) ans[s] = 0;
else if(ans[s] == -1) pq.push(make_pair(k[s]+t, make_pair(s, 1)));
while(!pq.empty() && t == pq.top().first){
//cout << pq.top().first << " " << pq.top().second << "\n";
//cout << "emptying " << pq.top().second.first+1 << "\n";
//if(ans[s] != -1) cout << ans[s] << " + " << t << " - " << pq.top().second.second << "\n";
if(ans[s] != -1)
ans[pq.top().second.first] = ans[s] + pq.top().second.second;
else
pq.push(make_pair(k[s]+t, make_pair(pq.top().second.first, pq.top().second.second+1)));
pq.pop();
}
if(!pq.empty())
GetAns(p[s], pq, t+1);
}
int main(){
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
fin >> n;
p.resize(n); k.resize(n); ans.resize(n, -1);
for(int i = 0; i < n; ++i)
fin >> k[i];
for(int i = 0, a, b; i < n-1; ++i)
fin >> a >> b, p[b-1] = a-1;
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
for(int i = 0; i < n; ++i){
if(ans[i] == -1) GetAns(i, pq, 0);
fout << ans[i] << " ";
}
}