Pagini recente » Diferente pentru pregatire-online-pentru-bacalaureatul-la-informatica intre reviziile 3 si 4 | Monitorul de evaluare | Cod sursa (job #3361874) | Cod sursa (job #3361872) | Cod sursa (job #3361871)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
int n, m;
vector<vector<int>> anc;
const int LOG_N = 20;
void preprocess_anc() {
for (int i = 1 ; i < LOG_N ; ++i) {
for (int j = 1 ; j <= n ; ++j) {
anc[i][j] = anc[i - 1][anc[i - 1][j]];
}
}
}
int find_anc(int node, int up_levels) {
if (up_levels >= (1 << LOG_N)) return 0;
for (int i = 0 ; i < LOG_N ; ++i) {
if (up_levels & (1 << i)) node = anc[i][node];
}
return node;
}
int main() {
cin >> n >> m;
anc.assign(LOG_N, vector<int>(n + 2));
for (int node = 1 ; node <= n ; ++node) {
int parent; cin >> parent;
anc[0][node] = parent;
}
for (int i = 1 ; i <= m ; ++i) {
int q, p; cin >> q >> p;
cout << find_anc(q, p) << "\n";
}
return 0;
}