Pagini recente » Cod sursa (job #2682274) | Cod sursa (job #1567966) | Cod sursa (job #1972041) | Cod sursa (job #2474939) | Cod sursa (job #865769)
Cod sursa(job #865769)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
const int NMAX = 100002, logMax = 18;
int N, K[NMAX], T[NMAX];
int C[NMAX];
int LG[NMAX];
int S[logMax][NMAX];
int query(int node) {
if(C[node] != -1) {
return C[node];
}
if(K[node] == 0) {
return C[node] = 0;
}
int Q = node, P = K[node];
for(int l = LG[P];P > 0;) {
Q = S[l][Q];
P -= (1<<l);
l = LG[P];
}
return C[node] = 1 + query(Q);
}
int main()
{
cin>>N;
for(int i = 1;i <= N;i++) {
cin>>K[i];
C[i] = -1;
LG[i + 1] = LG[(i + 1)>>1] + 1;
}
for(int i = 1;i < N;i++) {
int A, B;
cin>>A>>B;
S[0][B] = A;
}
for(int i = 1;i < logMax;i++) {
for(int j = 1;j <= N;j++) {
S[i][j] = S[i - 1][S[i - 1][j]];
}
}
for(int i = 1;i <= N;i++) {
cout<<query(i)<<" ";
}
return 0;
}