Pagini recente » Cod sursa (job #1978867) | Cod sursa (job #1147872) | Cod sursa (job #208802) | Cod sursa (job #897375) | Cod sursa (job #2082439)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int NMax = 25e4 + 2;
int N, M;
int A[21][NMax], Log[NMax], TT[NMax];
int Read(){
in >> N >> M;
for (int i = 1; i <= N; ++i)
in >> TT[i];
}
void Precalculate(){
for (int i = 2 ; i <= N; ++i)
Log[i] = Log[i/2] + 1;
for (int i = 1; i <= N; ++i)
A[0][i] = TT[i];
for (int i = 1; (1<<i) <= N; ++i)
for (int j = 1; j <= N; ++j)
A[i][j] = A[i-1][A[i-1][j]];
}
int Ancestor(int Q, int P){
while (P){
int k = Log[P];
Q = A[k][Q];
P -= (1<<k);
}
return Q;
}
void SolveAndPrint(){
Precalculate();
while (M--){
int Q, P;
in >> Q >> P;
out << Ancestor(Q, P) << '\n';
}
}
int main()
{
Read();
SolveAndPrint();
return 0;
}