Cod sursa(job #2493716)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 16 noiembrie 2019 19:16:44
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

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

int N, Q, T[NMAX];

vector < int > G[NMAX];

int Ancestor[MMAX][NMAX];

static inline void Read ()
{
    f.tie(NULL);

    f >> N >> Q;

    for(int i = 1; i <= N; ++i)
    {
        f >> T[i];

        if(T[i] == 0)
            continue;

        G[T[i]].push_back(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;

        f >> Node >> cnt;

        if(cnt == 0)
        {
            g << Node << '\n';

            continue;
        }

        if(T[Node] == 0)
        {
            g << 0 << '\n';

            continue;
        }

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

        g << Node << '\n';
    }

    return;
}

int main()
{
    Read();

    Precalculation();

    Solve();

    return 0;
}