Pagini recente » Cod sursa (job #1043134) | Cod sursa (job #2103541) | Cod sursa (job #2050868) | Cod sursa (job #1248285) | Cod sursa (job #2445983)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#define maxl int(log2(250001)+2)
using namespace std;
int n, m, i, j;
int sol[250001][maxl], level[250001], dad[250001];
bool rad[250001];
vector<int> graph[250001];
void read();
void prep();
void solve();
void dfs(int node, int cnt);
int main()
{
read();
prep();
solve();
return 0;
}
void read(){
freopen("stramosi.in", "r", stdin);
scanf("%d%d", &n, &m);
for(i=1; i<=n; ++i){
int head;
scanf("%d", &head);
dad[i]=head;
if(head) graph[head].push_back(i);
else rad[i]=true;
}
return;
}
void prep(){
level[0]=-1;
for(i=1; i<=n; ++i) if(rad[i]) dfs(i, 0);
return;
}
void solve(){
freopen("stramosi.out", "w", stdout);
for(i=1; i<=m; ++i){
int node, p;
scanf("%d%d", &node, &p);
if(p>level[node]){printf("0\n"); continue;}
while(p){
int j=int(log2(p));
node=sol[node][j];
p=p-(1<<j);
}
printf("%d\n", node);
}
return;
}
void dfs(int node, int cnt){
level[node]=level[dad[node]]+1;
sol[node][0]=dad[node];
int j, next=dad[node];
for(j=1; (1<<j)<=cnt; ++j){
sol[node][j]=sol[next][j-1];
next=sol[next][j-1];
}
for(auto i:graph[node]) if(i!=dad[node]){
dad[i]=node;
dfs(i, cnt+1);
}
return;
}