Cod sursa(job #3230175)

Utilizator DenisMiricaDenis Mirica DenisMirica Data 19 mai 2024 18:11:30
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
using namespace std;

ifstream inputFile("stramosi.in");
ofstream outputFile("stramosi.out");

const int MAX_LOG = 20;
const int MAX_N = 250005;

int ancestors[MAX_LOG][MAX_N];
int numberOfNodes, numberOfQueries;

void calculateAncestors() {
    // ancestors[level][node] = ancestor of 'node' at distance 2^level
    for (int level = 1; level < MAX_LOG; ++level) {
        for (int node = 1; node <= numberOfNodes; ++node) {
            ancestors[level][node] = ancestors[level - 1][ancestors[level - 1][node]];
        }
    }
}

int main() {
    inputFile >> numberOfNodes >> numberOfQueries;

    for (int i = 1; i <= numberOfNodes; ++i) {
        inputFile >> ancestors[0][i];
    }

    calculateAncestors();

    for (int i = 1; i <= numberOfQueries; ++i) {
        int node, distance;
        inputFile >> node >> distance;

        while (distance > 0) {
            int level = 0;
            while ((1 << (level + 1)) <= distance) {
                ++level;
            }
            distance -= (1 << level);
            node = ancestors[level][node];
        }

        outputFile << node << "\n";
    }

    return 0;
}