Pagini recente » Cod sursa (job #1648225) | Cod sursa (job #1675911) | Cod sursa (job #2419407) | Cod sursa (job #2465676) | Cod sursa (job #54624)
Cod sursa(job #54624)
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
#define NMAX 250001
int a[20][NMAX];
FILE *in = fopen("stramosi.in", "r"), *out = fopen("stramosi.out", "w");
int n, m;
/*
inline int findvlad(int nr, int times)
{
nr = N[nr-1];
for ( int i = times-1; i != 0; i-- )
{
if ( N[nr-1] == 0 )
return 0;
nr = N[nr-1];
}
return nr;
}
inline int cautarec(int nr, int times)
{
if (times>1)
nr=cautarec(a[0][nr-1],times-1);
else
nr=a[0][nr-1];
return nr;
}
*/
inline int cauta(int nr, int times)
{
nr = a[0][nr-1];
int tt=log2(times);
while (a[tt][nr-1]==-1) tt--;
int j=2<<tt;//pow(2,tt)+1;
for ( int i = j;i<=times; i++ )
{
int t=a[0][nr-1];
if ( t == 0 ) return 0;
if (i&(i-1)==0)
{
int lg;
if(a[lg=(int)log2(i)][t]!=-1)
return a[lg][t];
a[lg][nr-1]=t;
}
nr = t;
}
return nr;
}
int main ()
{
int temp1, temp2;
fscanf(in, "%d %d", &n, &m);
for ( int i = 0; i != n; ++i )
{
fscanf(in, "%d", &a[0][i]);
for ( int j = 1; j<20; ++j )
a[j][i] = -1;
}
for ( int i = m-1; i != -1; --i )
{
fscanf(in, "%d %d", &temp1, &temp2);
fprintf(out, "%d\n", cauta(temp1, temp2));
//fprintf(out, "%d\n", cautarec(temp1, temp2));
}
/*
for (int t=0;t<10;t++)
printf("%d\n",(2<<(t-1))+1);
*/
return 0;
}