Pagini recente » Cod sursa (job #965746) | Cod sursa (job #984917) | Cod sursa (job #2883749) | Cod sursa (job #1083165) | Cod sursa (job #151280)
Cod sursa(job #151280)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define NMAX 250010
#define LOG 20
long m, n;
long a[LOG][NMAX];
long raised[LOG];
int powmax;
inline int smaller(int n)
{
long pow = 1;
int i = 0;
while(pow <= n) pow *= 2, ++i;
return i-1;
}
void read()
{
long i;
long pow;
scanf("%ld %ld", &n, &m);
for(i = 1; i <= n; ++i)
scanf("%ld ", &a[0][i]);
powmax = smaller(n);
raised[0] = 1;
for(i = 1, pow = 2; pow <= n; ++i, pow *= 2)
raised[i] = pow;
}
void solve()
{
int i, j;
for(i = 1; i <= powmax; ++i)
for(j = 1; j <= n; ++j)
a[i][j] = a[ i-1 ][ a[i-1][j] ];
}
void query()
{
long x, y;
int pow;
while(m--)
{
scanf("%ld %ld", &x, &y);
while(y)
{
pow = smaller(y);
x = a[pow][x];
y -= raised[pow];
}
printf("%ld\n", x);
}
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
read();
solve();
/*
printf("%d\n", powmax);
int i, j;
for(i = 0; i <= powmax; ++i, printf("\n"))
for(j = 1; j <= n; ++j)
printf("%d ", a[i][j]);
*/
query();
return 0;
}