Pagini recente » Cod sursa (job #2564368) | Cod sursa (job #2566925) | Cod sursa (job #233837) | Cod sursa (job #411158) | Cod sursa (job #52369)
Cod sursa(job #52369)
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int N[250000];
int a[250000][18];
FILE *in = fopen("stramosi.in", "r"), *out = fopen("stramosi.out", "w");
int n, m;
inline int find(int nr, int times)
{
int x = log2(times);
while ( a[nr][x] == -1 )
--x;
if ( x == times )
return a[nr][x];
nr = a[nr][x];
//cout << "--> " << x << " " << nr << endl;
for ( int i = times-x-1; i != 0; --i )
{
//cout << "--> " << N[a[nr][x]] << endl;
if ( N[a[nr][x]] == 0 )
return 0;
nr = N[a[nr][x]-1];
}
//cout << "==> " << nr << endl;
return nr;
}
int main ()
{
int temp1, temp2;
fscanf(in, "%d %d", &n, &m);
for ( int i = 0; i != n; ++i )
{
fscanf(in, "%d", &N[i]);
a[i][0] = N[i];
for ( int j = 1; j != 18; ++j )
a[i][j] = -1;
}
for ( int i = m-1; i != -1; --i )
{
fscanf(in, "%d %d", &temp1, &temp2);
fprintf(out, "%d\n", find(temp1-1, temp2));
}
return 0;
}