Cod sursa(job #1147915)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 20 martie 2014 11:28:06
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <cmath>

#define Nmax 250666

using namespace std;
int DP[20][Nmax]; /// DP[i][j] -> al 2^i lea stramos al nodului j
int N,Q;

void read()
{
    scanf("%d%d", &N, &Q);
    for(int j = 1; j <= N; ++j)
        scanf("%d", &DP[0][j]); /// al 2^0 lea stramos al nodului j
}

void precompute()
{
    int ln = (int)log2(N);
    for(int i = 1; i <= ln; ++i)
        for(int j = 1; j <= N; ++j)
            DP[i][j] = DP[i-1][DP[i-1][j]];
}

void solve()
{
    int a,b,put;
    for(int i = 1; i <= Q; ++i)
    {
        scanf("%d%d", &a, &b);
        while(b)
        {
            put = 0;
            while( 1<<(put+1) <= b) ++put;
            b -= 1<<put;
            a = DP[put][a];
        }
        printf("%d\n",a);
    }
}

int main()
{
    freopen( "stramosi.in", "r", stdin );
    freopen( "stramosi.out", "w", stdout );

    read();
    precompute();
    solve();

    return 0;
}