Cod sursa(job #2349431)

Utilizator AlexVolatiluVoicu Alex AlexVolatilu Data 20 februarie 2019 14:33:20
Problema Stramosi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <stdio.h>

using namespace std;

int v[19][250005];

int get_lsb(int n)
{
    return (n&(n-1))^n;
}

int get_logpow2(int n)
{
    if(n == 0)
        return -1;
    int p = 0;
    while(n > 0)
    {
        p++;
        n = n>>1;
    }
    return p;
}

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

    int n, m, i, j, k, p, q, powk;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &(v[1][i]));
    }

    for(k = 2; 1<<k <= n; k++)
    {
        for(i = 1; i <= n; i++)
        {
            v[k][i] = v[k - 1][v[k - 1][i]];
        }
    }

    if(1<<k > n)
        k--;

    powk = 1<<k;
    int p_crt, anc, pas_pow;
    for(i = 0; i < m; i++)
    {
        scanf("%d%d", &q, &p);
        anc = q;
        while(p > 0)
        {
            p_crt = get_lsb(p);
            p -= p_crt;
            pas_pow = get_logpow2(p_crt);
            anc = v[pas_pow][anc];
        }
        printf("%d\n", anc);
    }


    return 0;
}