Pagini recente » Cod sursa (job #388831) | Clasament preONI 2006, Clasa a X-a | Cod sursa (job #1172152) | Cod sursa (job #1813745) | Cod sursa (job #3297189)
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream fin("stramosi.in");
std::ofstream fout("stramosi.out");
int N,M,P,Q;
int main(){
fin >> N >> M;
std::vector<int> parent(N + 1);
int log = 0;
while ( (1 << log) <= N){
log++;
}
std::vector<std::vector<int>> up(N + 1, std::vector<int>(log));
for ( int i = 1; i <= N; i++ ){
fin >> parent[i];
up[i][0] = parent[i];
}
for ( int i = 1; i < log; i++ ){
for ( int node = 1; node <= N; node++ ){
if ( up[node][i-1] != 0 ){
up[node][i] = up[up[node][i-1]][i-1];
}
else{
up[node][i] = 0;
}
}
}
// for ( int i = 1; i <= N; i++ ){
// for ( int j = 0; j < log; j++ ){
// std::cout << up[i][j] << ' ';
// }
// std::cout << '\n';
// }
for ( int i = 0; i < M; i++ ){
fin >> Q >> P;
for ( int j = 0; j < log; j++ ){
if ( P & (1<<j) ){
Q = up[Q][j];
if ( Q == 0 ){
break;
}
}
}
fout << Q << '\n';
}
}