Pagini recente » Borderou de evaluare (job #2493181) | Cod sursa (job #1454292) | Cod sursa (job #3339867) | Monitorul de evaluare | Cod sursa (job #2493719)
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 25e4 + 5, MMAX = 20;
int N, Q, T[NMAX];
int Ancestor[MMAX][NMAX];
static inline void Read ()
{
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
scanf("%d%d", &N, &Q);
for(int i = 1; i <= N; ++i)
scanf("%d", &T[i]);
return;
}
static inline void Precalculation ()
{
for(int i = 1; i <= N; ++i)
if(T[i])
Ancestor[0][i] = T[i];
for(int p = 1; (1 << p) <= N; ++p)
for(int i = 1; i <= N; ++i)
Ancestor[p][i] = Ancestor[p - 1][Ancestor[p - 1][i]];
return;
}
static inline void Solve ()
{
while(Q--)
{
int Node = 0, cnt = 0;
scanf("%d%d", &Node, &cnt);
if(cnt == 0)
{
printf("%d\n", Node);
continue;
}
if(T[Node] == 0)
{
printf("0\n");
continue;
}
for(int p = 0; (1 << p) <= cnt; ++p)
if(cnt & (1 << p))
Node = Ancestor[p][Node];
printf("%d\n", Node);
}
return;
}
int main()
{
Read();
Precalculation();
Solve();
return 0;
}