Pagini recente » Cod sursa (job #1346015) | Cod sursa (job #1544335) | Cod sursa (job #1269134) | Cod sursa (job #891089) | Cod sursa (job #2386674)
// 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();
}