Pagini recente » Cod sursa (job #1278125) | Cod sursa (job #178707) | Cod sursa (job #1126480) | Cod sursa (job #925824) | Cod sursa (job #2921692)
#include <bits/stdc++.h>
#define N_MAX 250005
#define M_MAX 300005
#define X 20
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
vector <int> G[N_MAX];
int T[X][N_MAX], lev[N_MAX], n, node, k;
bool root[N_MAX];
inline int get_lev(int node){
if (lev[node])
return lev[node];
return lev[node] = 1 + get_lev(T[0][node]);
}
inline int get_ancestor(){
int bit;
if (k >= lev[node])
return 0;
for (bit = X - 1; bit >= 0; bit--)
if (k & (1 << bit))
node = T[bit][node];
return node;
}
int main(){
int q, i, x;
fin >> n >> q;
for (i = 1; i <= n; i++){
fin >> x;
if (!x){
root[i] = true;
lev[i] = 1;
}
else
T[0][i] = x;
}
for (i = 1; i <= n; i++)
lev[i] = get_lev(i);
for (x = 1; x < X; x++)
for (i = 1; i <= n; i++)
T[x][i] = T[x - 1][T[x - 1][i]];
for (i = 1; i <= q; i++){
fin >> node >> k;
fout << get_ancestor() << "\n";
}
return 0;
}