Pagini recente » Cod sursa (job #215608) | Cod sursa (job #1953273) | Cod sursa (job #1066172) | Cod sursa (job #2131515) | Cod sursa (job #1760510)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
const int kNoduriNivel = 300;
struct Nod
{
int tata;
int stramos;
int nivel;
int adancime;
};
int GasesteStramos(const vector<Nod> &arb, int start, int k)
{
while (start > 0 && k > arb[start].adancime) {
k -= arb[start].adancime;
start = arb[start].stramos;
}
while (start > 0 && k > 0) {
start = arb[start].tata;
--k;
}
return start;
}
int main()
{
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m;
fin >> n >> m;
vector<Nod> noduri(n + 1, {0, 0, 1, 1});
for (int i = 1; i <= n; ++i) {
fin >> noduri[i].tata;
if (noduri[i].tata > 0) {
int tata = noduri[i].tata;
noduri[i].nivel = noduri[tata].nivel;
noduri[i].adancime = noduri[tata].adancime + 1;
noduri[i].stramos = noduri[tata].stramos;
if (noduri[i].adancime > kNoduriNivel) {
noduri[i].adancime = 1;
++noduri[i].nivel;
noduri[i].stramos = tata;
}
}
}
while (m--) {
int x, y;
fin >> x >> y;
fout << GasesteStramos(noduri, x, y) << "\n";
}
return 0;
}