Pagini recente » Cod sursa (job #1152308) | Cod sursa (job #1022929) | Cod sursa (job #1587774) | Cod sursa (job #2501199) | Cod sursa (job #2099649)
#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];
vector <int> v[N];
void dfs(int tata, int nod){
viz[nod] = 1;
dad[nod] = tata;
for(auto son : v[nod])
if(!viz[son])
dfs(nod, son);
}
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(){
in >> x >> y;
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++;
}
}
out << (cnt == y ? x : 0) << '\n';
}
int main(){
in >> n >> q;
for(int i = 1; i <= n; i++){
in >> x;
if(x == 0)
continue;
root[i] = 1;
v[x].push_back(i);
}
for(int i = 1; i <= n; i++)
if(!root[i])
dfs(0, i);
build();
while(q--)
solve();
return 0;
}