Pagini recente » Cod sursa (job #81030) | Cod sursa (job #2700378) | Cod sursa (job #966828) | Cod sursa (job #970102) | Cod sursa (job #3182362)
#include <fstream>
#include <algorithm>
using namespace std;
const int DIM = 250010;
const int LOG_DIM = 20;
int n, m;
int ancestor[LOG_DIM][DIM];
void calcAncestors() {
for (int p = 1; p < LOG_DIM; p++) {
for (int i = 1; i <= n; i++)
ancestor[p][i] = ancestor[p - 1][ancestor[p - 1][i]];
}
}
int findAncestor(int node, int count) {
int solNode = node;
for (int exp = LOG_DIM - 1; exp >= 0; exp--) {
int pow = (1 << exp);
if ((count & pow) == pow && solNode > 0) {
solNode = ancestor[exp][solNode];
count -= pow;
}
}
return solNode;
}
int main() {
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> ancestor[0][i];
calcAncestors();
for (int i = 1; i <= m; i++) {
int q, p;
fin >> q >> p;
fout << findAncestor(q, p) << '\n';
}
fin.close();
fout.close();
return 0;
}