Pagini recente » Cod sursa (job #196225) | Istoria paginii utilizator/adesafta2002 | Cod sursa (job #1787579) | Profil caineleturbo | Cod sursa (job #2099743)
#include <bits/stdc++.h>
#define N 250100
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
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]];
}
int solve(int nod, int p){
if(p == 0)
return nod;
int lvl = 0;
while((1 << lvl) - 1 <= p)
lvl++;
lvl--;
if(anc[lvl][nod] == 0)
return 0;
return solve(anc[lvl][nod], p - (1 << lvl) + 1);
}
int main(){
in >> n >> q;
for(int i = 1; i <= n; i++){
in >> x;
if(x == 0)
continue;
dad[i] = x;
}
build();
while(q--)
in >> x >> y, out << solve(x, y) << '\n';
return 0;
}