Pagini recente » Cod sursa (job #3309531) | Cod sursa (job #3342306) | Cod sursa (job #3313157) | Cod sursa (job #2780694) | Cod sursa (job #3324542)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
const int NMAX = 300005;
const int LGMAX = 19;
vector<int> v[NMAX], roots;
vector<pair<int, int>> ops[NMAX];
int ans[NMAX];
vector<int> st;
int anc[NMAX][LGMAX];
void dfs(int nod, int t) {
anc[nod][0] = t;
for (int j = 1; j < LGMAX; j++) {
anc[nod][j] = anc[anc[nod][j - 1]][j - 1];
}
for (auto i: v[nod]) {
dfs(i, nod);
}
}
int solve(int nod, int k) {
for (int i = 0; (1 << i) <= k; i++) {
if (k & (1 << i)) {
nod = anc[nod][i];
}
}
return nod;
}
int main() {
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
int a; cin >> a;
if (a == 0) {
roots.push_back(i);
} else {
v[a].push_back(i);
}
}
for (auto root: roots) {
dfs(root, 0);
}
for (int i = 1; i <= q; i++) {
int nod, k; cin >> nod >> k;
cout << solve(nod, k) << '\n';
}
return 0;
}