Pagini recente » Cod sursa (job #697618) | Cod sursa (job #894552) | Cod sursa (job #2831219) | Cod sursa (job #2455329) | Cod sursa (job #3157120)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("cerere.in");
ofstream cout ("cerere.out");
int stramos[18][100001] , trimis[100001] , durata[100001];
vector <int> adiacenta[100001];
void DeterminareStramosi (const int nod_actual , const int nod_sursa , const int adancime)
{
for (int exponent = 1 ; (1 << exponent) <= adancime ; exponent++)
stramos[exponent][nod_actual] = stramos[exponent - 1][stramos[exponent - 1][nod_actual]];
for (auto nod_vecin : adiacenta[nod_actual])
DeterminareStramosi(nod_vecin , nod_actual , adancime + 1);
}
void DeterminareDurata (const int nod_actual)
{
int stramos_final = nod_actual;
for (int exponent = 0 ; (1 << exponent) <= trimis[nod_actual] ; exponent++)
if (trimis[nod_actual] & (1 << exponent)) { stramos_final = stramos[exponent][stramos_final]; durata[nod_actual]++; }
durata[nod_actual] += durata[stramos_final];
for (auto nod_vecin : adiacenta[nod_actual])
DeterminareDurata(nod_vecin);
}
int main ()
{
int numar_noduri;
cin >> numar_noduri;
for (int indice = 1 ; indice <= numar_noduri ; indice++)
cin >> trimis[indice];
for (int indice = 1 , nod[2] ; indice < numar_noduri ; indice++)
{ cin >> nod[0] >> nod[1]; adiacenta[nod[0]].push_back(nod[1]); stramos[0][nod[1]] = nod[0]; }
DeterminareStramosi(1 , 0 , 0);
DeterminareDurata(1);
for (int indice = 1 ; indice <= numar_noduri ; indice++)
cout << durata[indice] << ' ';
cout.close(); cin.close();
return 0;
}