Cod sursa(job #684213)
#include <cstdio>
#define MAXN 250001
#define MAXM 300001
int n, m;
int dyn[18][MAXN];
void read();
void solve();
int nthParent(int nd, int nr)
{
int lognr =0, nrcp = nr, result = nd;
while (nrcp >>= 1)
lognr++;
for (int i = lognr ; i >= 0 ; --i)
if (nr & (1 << i))
result = dyn[i][result];
return result;
}
int main()
{
read();
solve();
freopen("stramosi.out", "w", stdout);
for (int i = 1 ; i <= m ; ++i)
{
int q, p;
scanf("%d%d", &q, &p);
printf("%d\n", nthParent(q, p));
}
return 0;
}
void read()
{
freopen("stramosi.in", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1 ; i <= n ; ++i)
scanf("%d", &dyn[0][i]);
}
void solve()
{
int copyOfN = n, logn = 0;
while (copyOfN >>= 1)
logn++;
for (int i = 1 ; i <= logn ; ++i)
for (int j = 1 ; j <= n ; ++j)
dyn[i][j] = dyn[i - 1][dyn[i - 1][j]];
}