Pagini recente » Cod sursa (job #3001043) | Cod sursa (job #1645356) | Cod sursa (job #1763874) | Cod sursa (job #2637052) | Cod sursa (job #2206170)
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAXN 250005
#define MAXLOGN 20
int n, m;
int parents[MAXLOGN][MAXN];
int query(int x, int depth) {
if (x == 0) {
return 0;
}
if (depth == 0) {
return x;
}
int index = 0;
while (parents[index + 1][x] != -1 && (depth - (1 << (index + 1))) > 0) {
index++;
}
return query(parents[index][x], depth - (1 << index));
}
int log2(int n) {
int result = 0;
while (n > 0) {
n /= 2;
result++;
}
return result;
}
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
memset(parents, -1, sizeof(parents));
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &parents[0][i]);
}
int logn = log2(n);
for (int k = 1; k < logn; ++k) {
for (int i = 1; i <= n; ++i) {
parents[k][i] = parents[k - 1][parents[k - 1][i]];
}
}
int x, depth;
for (int i = 0; i < m; ++i) {
scanf("%d %d", &x, &depth);
printf("%d\n", query(x, depth));
}
return 0;
}