Pagini recente » Cod sursa (job #1950995) | Istoria paginii runda/becreative4/clasament | Cod sursa (job #476342) | Info Oltenia 2019 | Cod sursa (job #2929389)
#include <fstream>
#define NMAX 250005
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int memo[NMAX][18];//al 2^j lea stramos al nodului i
int parent[NMAX], n, Logn, q;
void preProcess(){
for (int i = 1; i <= n; i++){
memo[i][0] = parent[i];
for(int j = 1; j < Logn; j++){
memo[i][j] = memo[memo[i][j-1]][j-1];
}
}
}
int findA(int n, int k){
for(int j = Logn-1; j >= 0; j--){
if(k >= (1 << j)){
n = memo[n][j];
k -= (1 << j);
}
}
return n;
}
int main(){
fin >> n >> q;
while((1 << Logn) <= n){
Logn ++;
}
for (int i = 1; i <= n; i++){
int parent_of_i;
fin >> parent_of_i;
parent[i] = parent_of_i;
}
preProcess();
for (int i = 1; i <= q; i++){
int node, kthAncestor;
fin >> node >> kthAncestor;
fout << findA(node, kthAncestor) << '\n';
}
return 0;
}