Cod sursa(job #3231972)

Utilizator maciucateodorMaciuca Teodor maciucateodor Data 28 mai 2024 12:15:41
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#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;
}