Pagini recente » Cod sursa (job #1335074) | Cod sursa (job #1571550) | Cod sursa (job #1104625) | Cod sursa (job #741113) | Cod sursa (job #1675729)
#include <iostream>
#include <cstdio>
using namespace std;
FILE *in, *out;
const int N_max = 100002;
const int Log = 18;
int v[N_max];
int A[Log][N_max]; /* A[i][j] == AL 2 ^ i STRAMOS AL LUI j */
int NR;
int N;
int Ancestor(int node, int p)
{
int i = 0;
NR += 1;
while(p != 0)
{
if(p & 1) /* p % 2 == 1 */
node = A[i][node];
p >>= 1; /* p = p / 2; */
i++;
}
if(!v[node]) return node;
else
Ancestor(node, v[node]);
}
int main()
{
in = fopen("cerere.in", "r");
out = fopen("cerere.out", "w");
int i, j, x, y;
fscanf(in, "%d", &N);
for(i = 1; i <= N; i++) fscanf(in, "%d", &v[i]);
for(i = 1; i < N; i++)
{
fscanf(in, "%d %d", &x, &y);
A[0][y] = x; /* PRIMUL STRAMOS AL LUI y ESTE CHIAR TATAL ACESTUIA */
}
/* CONSTRUIESC MATRICEA A */
for(i = 1; (1 << i) <= N; i++)
for(j = 1; j <= N; j++)
/* RECURENTA */
if(A[i - 1][j]) A[i][j] = A[i - 1][ A[i - 1][j] ];
for(i = 1; i <= N; i++)
{
/* SUNT LA NODUL i SI VREAU SA AJUNG LA AL v[i] - LEA STRAMOS */
NR = 0;
if(!v[i]) fprintf(out, "%d ", NR);
else
{
int rc = Ancestor(i, v[i]);
fprintf(out, "%d ", NR);
}
}
return 0;
}