Cod sursa(job #3157408)

Utilizator SSKMFSS KMF SSKMF Data 15 octombrie 2023 14:52:39
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin ("stramosi.in");
ofstream cout ("stramosi.out");

int stramos[20][250001] , adancime[250001];
vector <int> adiacenta[250001];

void DeterminareStramosi (const int nod_actual , const int nod_sursa)
{
    adancime[nod_actual] = adancime[nod_sursa] + 1;
    for (int exponent = 1 ; (1 << exponent) <= adancime[nod_actual] ; 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);
}

int main ()
{
    int numar_noduri , numar_intrebari;
    cin >> numar_noduri >> numar_intrebari;

    for (int nod_actual = 1 ; nod_actual <= numar_noduri ; nod_actual++)
        { cin >> stramos[0][nod_actual]; adiacenta[stramos[0][nod_actual]].push_back(nod_actual);  }

    adancime[0] = -1;
    for (auto radacina : adiacenta[0])
        DeterminareStramosi(radacina , 0);

    for (int nod_actual , indice_stramos ; numar_intrebari ; numar_intrebari--)
    {
        cin >> nod_actual >> indice_stramos;

        if (indice_stramos > adancime[nod_actual])
            { cout << "0\n"; continue; }

        for (int exponent = 0 ; (1 << exponent) <= indice_stramos ; exponent++)
            if (indice_stramos & (1 << exponent)) nod_actual = stramos[exponent][nod_actual];

        cout << nod_actual << '\n';
    }

    cout.close(); cin.close();
    return 0;
}