Pagini recente » Cod sursa (job #1715513) | Cod sursa (job #2072924) | Cod sursa (job #2344271) | Cod sursa (job #1887917) | Cod sursa (job #1295148)
#include <fstream>
using namespace std;
int ancestor[20][250000];
int findAncestor(int q, int p, int level)
{
for (int i = level; i >= 0; i--) {
if ((1 << i) & p)
q = ancestor[i][q];
}
return q;
}
int computeAncestors(int n)
{
int i, z;
for (i = 1, z = 2; z <= n; i++, z <<= 1) {
for (int j = 1; j <= n; j++) {
ancestor[i][j] = ancestor[i - 1][ancestor[i - 1][j]];
}
}
return i - 1;
}
int main()
{
ifstream in("stramosi.in");
ofstream out("stramosi.out");
int N, M, Q, P;
in >> N >> M;
for (int i = 1; i <= N; i++) {
in >> ancestor[0][i];
}
int lastLevel = computeAncestors(N);
for (int i = 0; i < M; i++) {
in >> Q >> P;
out << findAncestor(Q, P, lastLevel) << '\n';
}
in.close();
out.close();
}