Cod sursa(job #309831)

Utilizator sandyxpSanduleac Dan sandyxp Data 1 mai 2009 11:54:13
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#define IN "stramosi.in"
#define OUT "stramosi.out"

const int Max_N = 250000+1;
using namespace std;
int A[Max_N][18]; // 2^18 > Max_N

inline int stram(int p, int i) {
    if (A[p][i] || i == 0 || p == 0)
        return A[p][i];
    return A[p][i] = stram(stram(p, i-1), i-1);
}

int main() {
    freopen(IN, "rt", stdin);
    freopen(OUT, "wt", stdout);
    int N, M, i, j, p, q;
    scanf("%ld %ld", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf("%ld", &A[i][0]);
    // A[i][j] = al 2^j -lea stramos al lui i
    // Recurenta:
    // A[i][0] = T[i]
    // A[i][j] = A[ A[i][j-1], j-1 ];

    /*
    for (j = 1; (1<<j) < N; ++j)
        for (i = 1; i <= N; ++i)
            A[i][j] = A[ A[i][j-1] ][ j-1 ];
    */

    while (M--) {
        scanf("%ld %ld", &p, &q);
        // al q-lea stramos al lui p
        int step;
        for (step = 1, i = 0; step < q; step <<= 1, i++);
        for (; step && q && p; step >>= 1, i--)
            if (step <= q)
                p = stram(p, i), q -= step;
        printf("%ld\n", p);
    }
    return 0;
}
/* 0 1 2 2 4 1 6 0 8 8 10 10 12 */