Pagini recente » Cod sursa (job #1618444) | Cod sursa (job #1249890) | Cod sursa (job #1460139) | Cod sursa (job #1353278) | Cod sursa (job #2753559)
#include <iostream>
const int nMax = 250005;
int t[nMax][20], log2[nMax], n, m, nod, k, curr;
using namespace std;
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
// Input rapid
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> t[i][0];
}
// Calculeaza log2 pentru toate valorile din intervalul [1, n] (in O(n))
log2[1] = 0;
for (int i = 2; i <= n; i++) {
log2[i] = log2[i / 2] + 1;
}
// Parcurge fiecare numar
for (int i = 1; i <= n; i++) {
// Parcurge fiecare salt de 2
// E ok sa fie parcurse elementele mai intai si nu salturile, deoarece problema ne asigura ca
// indicele unui stramos este intotdeauna mai mic decat indicele elementului
for (int p = 1; t[i][p - 1] && p <= 19; p++) {
t[i][p] = t[t[i][p - 1]][p - 1];
}
}
for (int q = 1; q <= m; q++) {
cin >> nod >> k;
// Variabila curr va retine tatal la care sa ajuns (posibil 0)
curr = nod;
while (curr && k) {
curr = t[curr][log2[k]];
k -= (1 << log2[k]);
}
cout << curr << "\n";
}
return 0;
}