Cod sursa(job #3232241)

Utilizator DenisMiricaDenis Mirica DenisMirica Data 29 mai 2024 12:31:36
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fisierIntrare("stramosi.in");
ofstream fisierIesire("stramosi.out");

const int MAX_NIVEL = 20;
const int MAX_NODURI = 250005;

int stramosi[MAX_NIVEL][MAX_NODURI];
int numarNoduri, numarIntrebari;

void calculeazaStramosi() {
    // stramosi[nivel][nod] = stramosul 'nod'-ului la distanta 2^nivel
    for (int nivel = 1; nivel < MAX_NIVEL; ++nivel) {
        for (int nod = 1; nod <= numarNoduri; ++nod) {
            stramosi[nivel][nod] = stramosi[nivel - 1][stramosi[nivel - 1][nod]];
        }
    }
}

int main() {
    fisierIntrare >> numarNoduri >> numarIntrebari;

    for (int i = 1; i <= numarNoduri; ++i) {
        fisierIntrare >> stramosi[0][i];
    }

    calculeazaStramosi();

    for (int i = 1; i <= numarIntrebari; ++i) {
        int nod, distanta;
        fisierIntrare >> nod >> distanta;

        while (distanta > 0) {
            int nivel = 0;
            while ((1 << (nivel + 1)) <= distanta) {
                ++nivel;
            }
            distanta -= (1 << nivel);
            nod = stramosi[nivel][nod];
        }

        fisierIesire << nod << "\n";
    }

    return 0;
}