Pagini recente » Cod sursa (job #999695) | Cod sursa (job #2232750) | Cod sursa (job #1742973) | Cod sursa (job #1726977) | Cod sursa (job #3232086)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
const int MAXN = 250000;
const int LOG = 18;
vector<int> ancestor[MAXN + 1];
int lift[MAXN + 1][LOG];
void preprocess(int N) {
for (int i = 1; i <= N; ++i) {
lift[i][0] = ancestor[i][0];
}
for (int j = 1; (1 << j) <= N; ++j) {
for (int i = 1; i <= N; ++i) {
if (lift[i][j - 1] != 0) {
lift[i][j] = lift[lift[i][j - 1]][j - 1];
} else {
lift[i][j] = 0;
}
}
}
}
int getKAncestor(int node, int k) {
for (int j = 0; j < LOG; ++j) {
if (k & (1 << j)) {
node = lift[node][j];
if (node == 0) {
break;
}
}
}
return node;
}
int main() {
int N, M;
f >> N >> M;
for (int i = 1; i <= N; ++i) {
int anc;
f >> anc;
ancestor[i].push_back(anc);
}
preprocess(N);
for (int i = 0; i < M; ++i) {
int Q, P;
f >> Q >> P;
g << getKAncestor(Q, P) << "\n";
}
return 0;
}