Pagini recente » Cod sursa (job #1964555) | Cod sursa (job #1702981) | Cod sursa (job #1464414) | Cod sursa (job #1238544) | Cod sursa (job #2117506)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int NMAX = 100005;
int N;
int T[NMAX], V[NMAX];
int Ancestor[20][NMAX];
int Log2[NMAX];
int results[NMAX];
int finds[NMAX];
void Read(){
in >> N;
for(int i = 1; i <= N; ++i)
in >> V[i];
for(int i = 1; i <= N - 1; ++i){
int a, b;
in >> a >> b;
T[b] = a;
Ancestor[0][b] = a;
}
}
void Precalculate(){
for(int i = 2; i <= N; ++i)
Log2[i] = Log2[i / 2] + 1;
for(int i = 1; (1 << i) <= N; ++i)
for(int j = 1; j <= N; ++j)
Ancestor[i][j] = Ancestor[i - 1][Ancestor[i - 1][j]];
}
int Find(int node){
int order = V[node];
int original = node;
while(order){
int p = Log2[order];
node = Ancestor[p][node];
order = order - (1 << p);
}
finds[original] = node;
return node;
}
int Solve(int node){
if(V[node] == 0)
return 0;
int sol, to_go;
if(!finds[node])
Find(node);
to_go = finds[node];
if(!results[to_go])
Solve(to_go);
sol = 1 + results[to_go];
results[node] = sol;
return sol;
}
void Print(){
for(int i = 1; i <= N; ++i){
if(!results[i])
Solve(i);
out << results[i] << " ";
}
out << "\n";
}
int main(){
Read();
Precalculate();
Print();
return 0;
}