Cod sursa(job #634614)

Utilizator sebii_cSebastian Claici sebii_c Data 16 noiembrie 2011 19:25:29
Problema Stramosi Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 0.75 kb
#include <stdio.h>
#define NMAX 250010
#define LgMax 20

int A[LgMax][NMAX], Log2[NMAX];
int N;

void computeLog()
{
    int i;
    for (i=2; i<NMAX; ++i)
	Log2[i] = Log2[i/2] + 1;
}

void computeA()
{
    int i, j;
    for (i = 1; i <= Log2[N]; ++i)
	for (j = 1; j <= N; ++j)
	    A[i][j] = A[i-1][A[i-1][j]];
}

int find(int x, int k)
{
    while (k > 0) {
	x = A[Log2[k]][x];
	k -= (1<<Log2[k]);
    }
    return x;
}
    
int main()
{
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);
    int M, i, x, k;
    scanf("%d %d", &N, &M);
    for (i=1; i<=N; ++i) 
	scanf("%d", &A[0][i]);
    
    computeLog();
    computeA();
    for (i=1; i<=M; ++i) {
	scanf("%d %d", &x, &k);
	printf("%d\n", find(x, k));
    }
    
    return 0;
}