Pagini recente » Cod sursa (job #1493160) | Cod sursa (job #769522) | Cod sursa (job #2852409) | Cod sursa (job #3183637) | Cod sursa (job #3233843)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m;
vector<int> parents;
vector<vector<int>> ancestors;
void calc(){
for(int j = 1; j < ancestors[0].size(); j++){
for(int i = 1; i <= n; i++){
if(ancestors[i][j-1] != -1)
ancestors[i][j] = ancestors[ancestors[i][j-1]][j-1];
}
}
}
int nth_ancestor(int i, int p){
if(p == 0) return i;
int j = 0;
while((1 << (j+1)) <= p && j+1 < ancestors[0].size()) j++;
if(ancestors[i][j] == -1) return 0;
return nth_ancestor(ancestors[i][j], p - (1 << (j)));
}
int main(){
fin >> n >> m;
parents.resize(n+1);
ancestors.resize(n+1, vector<int>(log2(n)+1, -1));
for(int i = 1; i <= n; i++)
fin >> parents[i], ancestors[i][0] = parents[i];
ancestors[0][0] = -1;
calc();
/*for(int i = 1; i < ancestors.size(); i++){
cout << i << ": ";
for(auto x : ancestors[i])
cout << x << " ";
cout << "\n";
}*/
while(m--){
int x, y; fin >> x >> y;
fout << nth_ancestor(x, y) << "\n";
}
}