Pagini recente » Cod sursa (job #2713214) | Cod sursa (job #1916980) | Cod sursa (job #1294486) | Cod sursa (job #2407984) | Cod sursa (job #2069446)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int N,K[100005],T[100005],Log[100005],A[20][100005],Numar[100005];
void Read()
{
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;
T[b]=a;
}
}
void Precalculate()
{
for(int i = 2; i <= N; ++i)
Log[i] = Log[i/2] + 1;
for(int i = 1; i <= N; ++i)
A[0][i] = T[i];
for(int i = 1; (1<<i) <= N; ++i)
for(int j = 1; j <= N; ++j)
A[i][j] = A[i-1][A[i-1][j]];
}
int Ancestor(int Q, int P)
{
while(P)
{
int K = Log[P];
Q = A[K][Q];
P = P - (1<<K);
}
return Q;
}
void Solve()
{
for(int i=1;i<=N;i++)
{
int q=i,nr=0;
while(K[q]!=0)
{
q=Ancestor(q,K[q]);
nr++;
if(Numar[q]!=0)
{
nr=nr+Numar[q];
break;
}
if(K[q]==0)
Numar[i]=nr;
}
fout<<nr<<" ";
}
}
int main()
{
Read();
Precalculate();
Solve();
return 0;
}