Pagini recente » Cod sursa (job #1352807) | Cod sursa (job #3214174) | Cod sursa (job #3228306) | Cod sursa (job #2978899) | Cod sursa (job #3159820)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int MAXN = 250005;
int n, m;
int ancestors[MAXN][20];
vector <int> graph[MAXN];
bool visited[MAXN];
void Build(int node) {
visited[node] = true;
for (int e = 1; e < 20; e++) {
ancestors[node][e] = ancestors[ancestors[node][e - 1]][e - 1];
}
for (int child : graph[node]) {
if (visited[child]) {
continue;
}
Build(child);
}
}
int GetAncestor(int node, int grade) {
for (int e = 19; e >= 0; e--) {
if ((1 << e) <= grade) {
grade -= (1 << e);
node = ancestors[node][e];
}
}
return node;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> ancestors[i][0];
graph[ancestors[i][0]].push_back(i);
}
for (int i = 1; i <= n; i++) {
if (visited[i]) {
continue;
}
Build(i);
}
while (m--) {
int q, p;
fin >> q >> p;
fout << GetAncestor(q, p) << '\n';
}
}