Pagini recente » Cod sursa (job #1275840) | Cod sursa (job #530144) | Cod sursa (job #2016935) | Cod sursa (job #2092240) | Cod sursa (job #1951946)
#include <iostream>
#include <fstream>
#define nmax 250005
using namespace std;
int n,m,T[nmax],P[nmax][19];
int L[nmax];
int Log[nmax];
int ancestor(int nod, int y)
{
int a;
while(y>0)
{
a=Log[L[nod]-y-1];
nod=P[nod][a];
y-=(1<<a);
}
return nod;
}
int main()
{
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
fin>>x;
T[i]=x;
if(x==0) L[i]=0;
else L[i]=L[x]+1;
}
for(int i=2;i<=n;i++)
Log[i]=Log[i/2]+1;
for(int i=1;i<=n;i++)
P[i][0]=T[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
P[i][j]=P[ P[i][j-1] ][j-1];
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
fout<<ancestor(x,y)<<'\n';
}
fin.close();
fout.close();
return 0;
}