Pagini recente » Cod sursa (job #2439263) | Cod sursa (job #2230385) | Cod sursa (job #1028972) | Cod sursa (job #1941614) | Cod sursa (job #2099720)
#include <bits/stdc++.h>
#define N 250100
using namespace std;
#define dim 100000
char buff[dim];
int p = 0;
void read(int &nr){
nr = 0;
while(buff[p] < '0' || buff[p] > '9')
if(++p == dim) fread(buff, 1, dim, stdin), p = 0;
while(buff[p] >= '0' && buff[p] <= '9'){
nr = 10*nr + buff[p] - '0';
if(++p == dim) fread(buff, 1, dim, stdin), p = 0;
}
}
int n, m, x, y, q, dad[N], anc[20][N];
bool viz[N], root[N];
void build(){
int sz = log2(n);
for(int i = 1; i <= n; i++)
anc[0][i] = i;
for(int lvl = 1; lvl <= sz; lvl++)
for(int i = 1; i <= n; i++)
x = anc[lvl - 1][i], anc[lvl][i] = anc[lvl - 1][dad[x]];
}
void solve(){
if(anc[(int)log2(y)][x] == 0){
cout << "0\n";
return;
}
int cnt = 0;
while(cnt < y && dad[x] != 0){
int lvl = 1;
while(cnt + (1 << lvl) - 1 <= y && anc[lvl][x] != 0){
cnt += (1 << lvl) - 1;
x = anc[lvl][x];
lvl++;
}
}
cout << (cnt == y ? x : 0) << '\n';
}
int main(){
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
cin >> n >> q;
for(int i = 1; i <= n; i++){
read(x);
if(x == 0)
continue;
dad[i] = x;
}
build();
while(q--)
read(x), read(y), solve();
return 0;
}