Pagini recente » Cod sursa (job #218119) | Cod sursa (job #56042) | Cod sursa (job #2041961) | Cod sursa (job #2542627) | Cod sursa (job #1677411)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin ("cerere.in");
ofstream fout ("cerere.out");
const int nmax = 1e5+5;
vector <int> g[nmax];
bitset <nmax> viz;
int n, grad[nmax], lev[nmax], k[nmax], st[nmax], top, dp[nmax];
void dfs(int dad) {
vector <int> :: iterator son;
viz[dad]=true;
st[++top]=dad;
if(k[dad]==0) dp[dad]=0;
else dp[dad]=dp[st[lev[dad]-k[dad]]]+1;
for(son=g[dad].begin(); son!=g[dad].end(); son++) {
if(viz[*son]==false) {
lev[*son]=lev[dad]+1;
dfs(*son);
}
}
top--;
}
int main() {
ios_base::sync_with_stdio(false);
int i, x, y, root=0;
fin >> n;
for(i=1; i<=n; i++)
fin >> k[i];
for(i=1; i<n; i++) {
fin >> x >> y;
g[x].push_back(y);
grad[y]++;
}
for(i=1; i<=n && !root; i++) {
if(grad[i]==0) root=i;
}
lev[root]=1;
dfs(root);
for(i=1; i<=n; i++)
fout << dp[i] << " ";
fin.close();
fout.close();
return 0;
}