Pagini recente » Borderou de evaluare (job #3306896) | Borderou de evaluare (job #1456299) | Borderou de evaluare (job #3356988) | Borderou de evaluare (job #3330582) | Cod sursa (job #3355804)
#include <bits/stdc++.h>
using namespace std;
const int nm=300000;
int jmp[20][nm+5],tt[nm];
int d[nm];
vector<int>adj[nm];
int lca(int a, int b){
if(d[a]<d[b]){
swap(a,b);
}
for(int i=19;i>-1;--i){
if(d[jmp[i][a]]>=d[b])a=jmp[i][a];
}
if(a==b)return a;
for(int i=19;i>=0;--i)
if(jmp[i][a]!=jmp[i][b])
{
a=jmp[i][a];
b=jmp[i][b];
}
return tt[a];
}
void dfs(int nod){
for(auto it:adj[nod]){
d[it]=d[nod]+1;
dfs(it);
}
return;
}
int main()
{
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> tt[i];
}
for (int i = 1; i <= n; i++) {
if (tt[i] != 0) {
int p = tt[i];
adj[p].push_back(i);
}
}
for(int i=1;i<=n;i++){
jmp[0][i]=tt[i];
}
for(int i=1;i<20;i++){
for(int j=1;j<=n;j++){
jmp[i][j]=jmp[i-1][jmp[i-1][j]];
}
}
dfs(1);
for(int i=1;i<=m;i++){
int a,b;
cin >> a >> b;
int nod=a;
for(int j=19;j>=0;j--)
{
if((1<<j)<=b)
{
nod=jmp[j][nod];
b-=(1<<j);
}
}
cout << nod << '\n';
}
return 0;
}