Pagini recente » Cod sursa (job #1116742) | Cod sursa (job #3208798) | Cod sursa (job #1293250) | Cod sursa (job #2781366) | Cod sursa (job #1127084)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin ("cerere.in");
ofstream fout ("cerere.out");
const int NMAX = 100009;
int N; int T[NMAX]; int K[NMAX]; bool fath[NMAX];
vector<int> G[NMAX];
int S[NMAX];
void dfs(int nod) {
fath[nod] = true;
S[++S[0]] = nod;
for(unsigned i = 0 ;i < G[nod].size(); ++i)
if(fath[G[nod][i]] == false)
dfs(G[nod][i]);
if(S[0] < K[nod]) T[nod] = 0;
else T[nod] = S[S[0] - K[nod]];
S[--S[0]];
}
int main() {
fin >> N;
for(int i = 1; i <= N; ++i)
fin >> K[i];
for(int i = 1; i < N; ++i) {
int a, b; fin >> a >> b;
G[a].push_back(b);
fath[b] = true;
}
for(int i = 1; i <= N; ++i)
if(fath[i] == false) G[0].push_back(i);
memset(fath, false, sizeof(fath));
dfs(0);
for(int i = 1; i <= N; ++i){
int A = i; int cnt = 0;
while(K[A]) A = T[A], cnt++;
fout << cnt <<" ";
}
return 0;
}