Cod sursa(job #3157120)

Utilizator SSKMFSS KMF SSKMF Data 14 octombrie 2023 13:41:33
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
}