Cod sursa(job #2386674)

Utilizator bolovMihail Balan bolov Data 23 martie 2019 13:20:58
Problema Stramosi Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
// https://www.infoarena.ro/problema/stramosi

#ifdef __GNUC__
    #define NDEBUG
#endif

#include <cassert>
#include <fstream>
#include <iostream>
#include <vector>

constexpr const char newl = '\n';

struct Ancestor
{
    int member;
    int level;
};

struct Problem
{
    int N, M;
    std::vector<int> parents;
    std::ifstream in;
    std::ofstream out;

    auto start_read_input()
    {
        in.open("stramosi.in");
        assert(in);

        in >> N >> M;
        assert(in);

        parents.resize(N + 1);

        parents[0] = 0;

        for (int i = 1; i < parents.size(); ++i)
        {
            in >> parents[i];
        }
    }

    auto close_in() { in.close(); }

    auto open_out()
    {
        out.open("stramosi.out");
        assert(out);
    }
    auto write_solution(int ancestor)
    {
        out << ancestor << newl;
        assert(out);
    }

    auto close_out() { out.close(); }

    auto solve(Ancestor ancestor) -> int
    {
        while (ancestor.level > 0)
        {
            assert(ancestor.member < static_cast<int>(parents.size()));
            ancestor.member = parents[ancestor.member];
            --ancestor.level;

            if (ancestor.member == 0)
                return 0;
        }
        return ancestor.member;
    }

    auto read_question() -> Ancestor
    {
        Ancestor ancestor;

        in >> ancestor.member >> ancestor.level;
        assert(in);
        return ancestor;
    }

    auto solve()
    {
        start_read_input();
        open_out();

        for (int i = 0; i < M; ++i)
        {
            write_solution(solve(read_question()));
        }

        close_in();
        close_out();
    }
};

int main()
{
    Problem problem;
    problem.solve();
}