Pagini recente » Cod sursa (job #2057073) | Cod sursa (job #2848159) | Cod sursa (job #748873) | Cod sursa (job #1714650) | Cod sursa (job #977387)
Cod sursa(job #977387)
#include <vector>
#include <cstdio>
using namespace std;
const int MAX_N = 250002;
int N, M;
int dp[MAX_N][20], F[MAX_N], log2[MAX_N];
vector < int > v[MAX_N], Lv[MAX_N];
inline void DFS(int x, int lv) {
Lv[lv].push_back(x);
for(size_t i = 0; i < v[x].size(); ++i)
DFS(v[x][i], lv+1);
}
inline int Query(int x, int k) {
while(k) {
int t = log2[k];
x = dp[x][t];
k -= (1 << t);
}
return x;
}
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++i) {
scanf("%d", &F[i]);
v[F[i]].push_back(i);
}
for(int i = 2; i < MAX_N; ++i)
log2[i] = log2[i/2] + 1;
for(int i = 1; i <= N; ++i)
if(!F[i])
DFS(i, 0);
for(int i = 1; i < N; ++i) {
for(size_t j = 0; j < Lv[i].size(); ++j) {
int x = Lv[i][j];
dp[x][0] = F[x];
for(int k = 1; (1 << k) <= i; ++k)
dp[x][k] = dp[dp[x][k-1]][k-1];
}
}
for(int i = 1, x, k; i <= M; ++i) {
scanf("%d %d", &x, &k);
printf("%d\n", Query(x, k));
}
return 0;
}