Pagini recente » Cod sursa (job #39581) | Cod sursa (job #2444505) | Cod sursa (job #1098687) | Cod sursa (job #2337085) | Cod sursa (job #3232241)
#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;
}