Cod sursa(job #729567)

Utilizator warchildmdMihail Burduja warchildmd Data 29 martie 2012 18:49:14
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>

int N, M;

int log(int x)
{
    int counter = -1;
    int i = 1;
    while(i <= x)
    {
        i = i<<1;
        counter++;
    }
    return counter;
}

int P, Q;

int stramos[250001];
int st[250000][20];

int str(int Q, int P)
{
    if(P == 0)
    {
        return Q;
    }
    int pass = log(P);
    int current = st[Q][pass];
    return str(current, P - pass - 1);
}

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

    scanf("%d %d\n", &N, &M);
    for(int i = 1; i <= N; i++)
    {
        scanf("%d ", &stramos[i]);
        st[i][0] = stramos[i];
    }

    //construim st
    for(int j = 1; j < 19; j++)
    {
        for(int i = 1; i <= N; i++)
        {
            st[i][j] = st[st[i][j-1]][j-1];
        }
    }

    /*for(int j = 0; j < 19; j++)
    {
        for(int i = 1; i <= N; i++)
        {
            printf("%d ", st[i][j]);
        }
        printf("\n");
    }*/

    int current;
    int pass;

    for(int i = 1; i <= M; i++)
    {
        scanf("%d %d\n", &Q, &P);
        printf("%d\n", str(Q, P));
    }
    return 0;
}