Pagini recente » Cod sursa (job #898550) | Cod sursa (job #881436) | Cod sursa (job #2119155) | Cod sursa (job #671626) | Cod sursa (job #309864)
Cod sursa(job #309864)
#include <iostream>
#define IN "stramosi.in"
#define OUT "stramosi.out"
const int Max_N = 250000+1;
using namespace std;
int A[18][Max_N]; // 2^18 > Max_N
int main() {
freopen(IN, "rt", stdin);
freopen(OUT, "wt", stdout);
int N, M, i, j, p, q;
scanf("%d %d", &N, &M);
for (i = 1; i <= N; ++i) {
scanf("%d", &A[0][i]);
}
// A[i][j] = al 2^j -lea stramos al lui i
// Recurenta:
// A[i][0] = T[i]
// A[i][j] = A[ A[i][j-1], j-1 ];
for (i = 1; (1<<i) < N; ++i)
for (j = 1; j <= N; ++j)
A[i][j] = A[i-1][ A[i-1][j] ];
for (j = 0; j < M; ++j) {
scanf("%d %d", &p, &q);
if (q > N) {
printf("0\n");
continue;
}
// al q-lea stramos al lui p
int step;
for (step = 1, i = 0; step < q; step <<= 1, i++);
for (; step && q && p; step >>= 1, i--)
if (step <= q)
p = A[i][p], q -= step;
printf("%d\n", p);
}
return 0;
}