Pagini recente » Cod sursa (job #857258) | Cod sursa (job #1048666) | Cod sursa (job #931248) | Borderou de evaluare (job #2020171) | Cod sursa (job #3157408)
#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;
}