Pagini recente » Borderou de evaluare (job #1702280) | Borderou de evaluare (job #1731618) | Cod sursa (job #323586) | Cod sursa (job #1975777) | Cod sursa (job #3231972)
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
void read_input(int &N, int &M, vector<int> &ancestors, vector<pair<int, int>> &queries) {
ifstream infile("stramosi.in");
infile >> N >> M;
ancestors.resize(N + 1);
for (int i = 1; i <= N; ++i) {
infile >> ancestors[i];
}
queries.resize(M);
for (int i = 0; i < M; ++i) {
infile >> queries[i].first >> queries[i].second;
}
infile.close();
}
// Function to write output to file
void write_output(const vector<int> &results) {
ofstream outfile("stramosi.out");
for (int res : results) {
outfile << res << endl;
}
outfile.close();
}
int main() {
int N, M;
vector<int> ancestors;
vector<pair<int, int>> queries;
read_input(N, M, ancestors, queries);
int max_power = ceil(log2(N));
vector<vector<int>> dp(N + 1, vector<int>(max_power + 1, 0));
for (int i = 1; i <= N; ++i) {
dp[i][0] = ancestors[i];
}
for (int j = 1; j <= max_power; ++j) {
for (int i = 1; i <= N; ++i) {
if (dp[i][j - 1] != 0) {
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
}
}
vector<int> results(M);
for (int i = 0; i < M; ++i) {
int member = queries[i].first;
int steps = queries[i].second;
for (int j = max_power; j >= 0; --j) {
if (steps >= (1 << j)) {
member = dp[member][j];
if (member == 0) {
break;
}
steps -= (1 << j);
}
}
results[i] = member;
}
write_output(results);
return 0;
}