Cod sursa(job #601658)

Utilizator vlad2901Vlad Berindei vlad2901 Data 7 iulie 2011 12:44:23
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <math.h>
#define MAX 250001
#define LOGMAX 19

int a[MAX][LOGMAX];

int pos(int n)
{
    int i, nr = 0;
    for(i = 1;i<=n;i = i<<1)
    {
        if(n & i)
        {
            return nr;
        }
        nr ++;
    }
    return -1;

}

int main()
{
    int n, m, p, q, aux, coef, str, i, j, rang, log2n;

    FILE *fin = freopen("stramosi.in", "r", stdin);
    FILE *fout = freopen("stramosi.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for(i=1;i<=n;i++)
    {
        scanf("%d", &a[i][0]);
    }

    log2n = ceil(log2(n));

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=log2n;j++)
        {
            a[i][j] = a[a[i][j-1]][j-1];
        }
    }

    for(i=0;i<m;i++)
    {
        scanf("%d %d", &q, &p);

        aux = p;
        str = q;

        while(aux)
        {
            coef = aux ^ (aux & (aux-1));
            //rang = (int)log2(coef);
            rang = pos(coef);
            str = a[str][rang];
            aux = aux & (aux-1);
        }
        printf("%d\n", str);

    }

    return 0;
}