Cod sursa(job #790030)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 20 septembrie 2012 01:10:57
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <cstdio>
int log2(int x)
{
    return x == 1 ? 0 : 1 + log2(x >> 1);
    int c = 0;
    while(x)
    {
        c++;
        x = x >> 1;
    }
    return c - 1;
}
int N, M, *S, p, q, u;
int mem[33][250002];
int main()
{
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);
    scanf("%d%d\n", &N, &M);
    S = new int[N + 1];
    S[0] = 0;
    for(int i = 1; i <= N; i++)
        scanf("%d", S + i);
    for(int i = 0; i <= N; i++)
        mem[0][i] = S[i];
    for(int j = 1; j < log2(M) + 1; j++)
        for(int i = 0; i <= N; i++)
            mem[j][i] = mem[j - 1][mem[j - 1][i]];
    while(M--)
    {
        scanf("%d%d", &q, &p);
        while(u = (p & (p - 1)))
            q = mem[log2(p - u)][q], p = u;
        printf("%d\n", mem[log2(p)][q]);
    }
    return 0;
}