Pagini recente » Cod sursa (job #2126590) | Cod sursa (job #827105) | Cod sursa (job #2665874) | Cod sursa (job #554939) | Cod sursa (job #2157865)
#pragma GCC optimize("03")
#include <bits/stdc++.h>
using namespace std;
int p;
#define dim 10000
char buff[dim];
void read(int &nr){
nr = 0;
while (buff[p] < '0' || buff[p] > '9'){
if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
}
while (buff[p] >='0' && buff[p] <='9'){
nr = nr*10 + buff[p] - '0';
if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
}
}
int n, a[100010], ans[100010], pr[100010], nxt[100010];
int get(int q){
if (ans[q] != -1) return ans[q];
int nod = q;
if (nxt[q]) nod = nxt[q];
else {
for (int i=1; i<=a[q]; i++) nod = pr[nod];
nxt[q] = nod;
}
ans[q] = 1 + get(nod);
return ans[q];
}
int main(){
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read(n);
for (int i=1; i<=n; i++){
read(a[i]);
if (a[i]) ans[i] = -1;
}
for (int i=1; i<n; i++){
int a, b;
read(a); read(b);
pr[b] = a;
}
for (int i=1; i<=n; i++) cout << get(i) << " ";
return 0;
}