Pagini recente » Cod sursa (job #2706606) | Cod sursa (job #3143937) | Cod sursa (job #729144) | Cod sursa (job #323686) | Cod sursa (job #3233842)
#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){
int j = 0;
while((1 << (j+1)) <= p && j+1 < ancestors[0].size()) j++;
int ans = ancestors[i][j];
int left = (1 << j);
if(ans == -1) return 0;
while(left < p && ans != 0) ans = parents[ans], cout << ans << "\n", left++;
if(left != p) return 0;
if(ans == -1) return 0;
return ans;
}
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";
}
}