Pagini recente » Cod sursa (job #2671463) | Cod sursa (job #2553789) | Cod sursa (job #1254400) | Cod sursa (job #865131) | Cod sursa (job #2260913)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("stramosi.in");
ofstream out ("stramosi.out");
int const nmax = 250000;
int const lgmax = 17;
int lg[5 + nmax];
int far[5 + lgmax][5 + nmax];
int n;
inline void computefar(){
for(int h = 1 ; h <= lgmax ;h++){
for(int i = 1 ; i <= n ;i++){
far[h][i] = far[h - 1] [far[h - 1][i]];
}
}
}
inline int query(int &node ,int &p){
while(0 < p && 0 < node){
node = far[lg[p]][node];
p -= (1 << lg[p]);
}
return node;
}
int main()
{
int k;
in >> n >> k;
for(int i = 1 ; i <= n ;i++){
in >> far[0][i];
}
lg[1] = 0;
for(int i = 2 ; i <= n ;i++){
lg[i] = lg[(i >> 1)] + 1;
}
computefar();
int a , b;
for(int i = 1 ; i <= k ;i++){
in >> a >> b;
out << query(a , b) << '\n';
}
return 0;
}