Pagini recente » Cod sursa (job #1696619) | Cod sursa (job #2105491) | Cod sursa (job #2257617) | Cod sursa (job #285048) | Cod sursa (job #1675829)
#include <cstdio>
using namespace std;
const int N_max = 100002;
const int Size = 3000000;
const int Log = 18;
int poz;
char buff[Size];
int v[N_max];
int A[Log][N_max]; /* A[i][j] == AL 2 ^ i STRAMOS AL LUI j */
int N;
void get_number(int &nr)
{
nr = 0;
while(buff[poz] < '0' || buff[poz] > '9')
{
poz++;
if(poz == Size)
{
fread(buff, 1, Size, stdin);
poz = 0;
}
}
while(buff[poz] >= '0' && buff[poz] <= '9')
{
nr = nr * 10 + buff[poz++] - '0';
if(poz == Size)
{
fread(buff, 1, Size, stdin);
poz = 0;
}
}
}
int Ancestor(int node, int p)
{
int i = 0;
if(!v[node]) return 0;
while(p != 0)
{
if(p & 1) node = A[i][node];
p >>= 1;
i++;
}
int r = Ancestor(node, v[node]);
return 1 + r;
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int i, j, x, y;
get_number(N);
for(i = 1; i <= N; i++) get_number(v[i]);
for(i = 1; i < N; i++)
{
get_number(x);
get_number(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 */
int NR = Ancestor(i, v[i]);
printf("%d ", NR);
}
fclose(stdin);
fclose(stdout);
return 0;
}