Pagini recente » Cod sursa (job #962139) | Cod sursa (job #3278648) | Cod sursa (job #2367450) | Cod sursa (job #3291265) | Cod sursa (job #2311130)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMax = 100000;
int A[NMax + 5][20], K[NMax + 5], C[NMax + 5], N, x, y;
void Precalc() {
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 Nod, int O) {
int k = 0;
while(O) {
if(O & 1)
Nod = A[k][Nod];
O /= 2, k++;
}
return Nod;
}
int Cerere(int Nod) {
if(C[Nod]) return C[Nod];
if(!K[Nod]) return 0;
x = Ancestor(Nod, K[Nod]); y = Cerere(x);
C[x] = y;
return 1 + C[x];
}
int main()
{
fin >> N;
for(int i = 1; i <= N; i++)
fin >> K[i];
for(int i = 1; i < N; i++) {
fin >> x >> y;
A[0][y] = x;
}
Precalc();
for(int i = 1; i <= N; i++) {
if(!C[i])
C[i] = Cerere(i);
fout << C[i] << " ";
}
fout << '\n';
fin.close();
fout.close();
return 0;
}