Cod sursa(job #2493719)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 16 noiembrie 2019 19:20:42
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMAX = 25e4 + 5, MMAX = 20;

int N, Q, T[NMAX];

int Ancestor[MMAX][NMAX];

static inline void Read ()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);

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

    scanf("%d%d", &N, &Q);

    for(int i = 1; i <= N; ++i)
        scanf("%d", &T[i]);

    return;
}

static inline void Precalculation ()
{
    for(int i = 1; i <= N; ++i)
        if(T[i])
            Ancestor[0][i] = T[i];

    for(int p = 1; (1 << p) <= N; ++p)
        for(int i = 1; i <= N; ++i)
            Ancestor[p][i] = Ancestor[p - 1][Ancestor[p - 1][i]];

    return;
}

static inline void Solve ()
{
    while(Q--)
    {
        int Node = 0, cnt = 0;

        scanf("%d%d", &Node, &cnt);

        if(cnt == 0)
        {
            printf("%d\n", Node);

            continue;
        }

        if(T[Node] == 0)
        {
            printf("0\n");

            continue;
        }

        for(int p = 0; (1 << p) <= cnt; ++p)
            if(cnt & (1 << p))
                Node = Ancestor[p][Node];

        printf("%d\n", Node);
    }

    return;
}

int main()
{
    Read();

    Precalculation();

    Solve();

    return 0;
}