Pagini recente » Cod sursa (job #1951736) | Istoria paginii runda/moisil_dornescu/clasament | Cod sursa (job #667790) | Cod sursa (job #61345) | Cod sursa (job #1536848)
#include<fstream>
#include<vector>
#include<iostream>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int str[100005], TT[20][100005], Log[100005], sol[100005];
int n, rad;
vector <int> G[100005];
void citire()
{
int x, y;
f>>n;
for(int i=1; i<=n; i++)
f>>str[i];
for(int i=1; i<n; i++){
f>>x>>y;
TT[0][y] = x;
G[x].push_back(y);
}
}
void precalc()
{
int i, j;
for(i=2; i<=n; i++)
Log[i] = Log[i/2] + 1;
for(i=1; i<=Log[n]; i++)
for(j=1; j<=n; j++)
TT[i][j] = TT[i-1][TT[i-1][j]];
for(i=1; i<=n; i++)
if(TT[0][i] == 0)
rad = i;
}
int stramos(int nod, int ance)
{
int red;
while(ance){
red = Log[ance];
nod = TT[red][nod];
ance -= (1<<red);
}
return nod;
}
void DFS(int nod)
{
int i, vecin, ance;
for(i=0; i<G[nod].size(); i++){
vecin = G[nod][i];
if(vecin != TT[0][nod]){
if(str[vecin]){
ance = stramos(vecin, str[vecin]);
sol[vecin] = sol[ance] + 1;
}
}
}
for(i=0; i<G[nod].size(); i++){
vecin = G[nod][i];
if(vecin != TT[0][nod]){
DFS(vecin);
}
}
}
void afisare()
{
for(int i = 1; i<=n; i++)
g<<sol[i]<<" ";
g<<"\n";
}
int main()
{
citire();
precalc();
DFS(rad);
afisare();
return 0;
}