Pagini recente » Cod sursa (job #895347) | Cod sursa (job #2287059) | Cod sursa (job #1952722) | Cod sursa (job #2620965) | Cod sursa (job #1713537)
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 250005;
const int kSqrt = 128;
int Depth[kMaxN], Parent[kMaxN], Link[kMaxN];
vector<int> G[kMaxN];
void dfs() {
queue<int> Q;
Q.push(0);
while(!Q.empty()) {
int node = Q.front();
Q.pop();
for(int vec : G[node]) {
Depth[vec] = Depth[node] + 1;
Parent[vec] = node;
Link[vec] = (Depth[node] % kSqrt) ? Link[node] : node;
Q.push(vec);
}
}
}
int kth(int node, int k) {
int seek_d = Depth[node] - k;
if(seek_d <= 0) return 0;
while(Depth[Link[node]] > seek_d)
node = Link[node];
while(Depth[node] != seek_d)
node = Parent[node];
return node;
}
void Read(int &a) {
char c;
for(c = getchar(); !isdigit(c); c = getchar());
for(a = 0; isdigit(c); c = getchar())
a = (a << 1) + (a << 3) + c - '0';
}
void W(int a) {
if(a > 0) {
W(a / 10);
putchar(a % 10 + '0');
}
}
void Write(int a) {
if(a == 0) putchar('0');
else W(a);
putchar('\n');
}
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
int n, m, p;
Read(n); Read(m);
for(int i = 1; i <= n; ++i) {
Read(p);
G[p].push_back(i);
}
dfs();
while(m--) {
int a, b;
Read(a); Read(b);
Write(kth(a, b));
}
return 0;
}