Pagini recente » Cod sursa (job #2898093) | Cod sursa (job #1652488) | Cod sursa (job #417933) | Cod sursa (job #142420) | Cod sursa (job #2738127)
//Ilie Dumitru
#include<cstdio>
int N, stramos[250005][19];
void compute()
{
int i, j;
for(i=2;i<=N;++i)
for(j=1;j<19 && stramos[i][j-1];++j)
stramos[i][j]=stramos[stramos[i][j-1]][j-1];
}
int log2(int x)
{
int l=-1;
do
{
x>>=1;
l++;
}while(x);
return l;
}
int solve(int a, int b)
{
if(!a)
return 0;
if(b)
{
int n=b&(b-1);
return solve(stramos[a][log2(b-n)], n);
}
return a;
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
int M, i, a, b;
scanf("%d%d", &N, &M);
for(i=1;i<=N;++i)
scanf("%d", &stramos[i][0]);
compute();
do
{
scanf("%d%d", &a, &b);
printf("%d\n", solve(a, b));
}while(--M);
fclose(stdin);
fclose(stdout);
return 0;
}