Pagini recente » Cod sursa (job #1238771) | Cod sursa (job #2270996) | Cod sursa (job #2500598) | Cod sursa (job #1183205) | Cod sursa (job #1070015)
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h>
using namespace std;
const int nmax = 258000;
//vector < int > a[nmax];
int n,m,T[nmax],P[nmax][100];//,h=0;
void dfs(){
int i,j;
for(i=0;i<=n;i++)
for(j=0;1<<j<=n;j++)P[i][j]=-1;
P[0][0]=0;
for(i=1;i<=n;i++)P[i][0]=T[i];
for(j=1;1<<j<=n;j++)
for(i=1;i<=n;i++)
if(P[i][j-1]!=-1 )
P[i][j] = P[P[i][j-1]][j-1];
}
int lca(int x,int y){//x-nodul y al citilea stamos
int log,i;/*
if(L[x]<L[y])swap(x,y);
for(i=log;i>=0;i--)
if(L[x] -(1<<i)>=L[y])x=P[x][i];
if(x==y)return x;
for(i=log;i>=0;i--)
if (P[x][i]!=-1 && P[x][i]!=P[y][i]){
x = P[x][i] ; y = P[y][i] ;
}
return T[x];*/
for(log=1;1<<log<=y;log++);log--;
if(P[x][log]!=-1){
x=P[x][log];
y-=1<<log;
} //return y;
while(y>0){
x=T[x];
y--;
}
return x;
}
int main(){
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y;
T[0]=0;//n++;
for(int i=1;i<=n;i++){
scanf("%d",&T[i]);//T[i]+1;
//L[i] = L[T[i]]+1;
}
dfs();
/* for(int j=1;j<=n;j++)
{
for(int i=0;1<<i<n;i++)printf("%d ",P[j][i]);
printf("\n");
}
*/
//printf("%d\n",lca(13,3));
for(int i=1;i<=m;i++){
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
fclose(stdout); fclose(stdin);
return 0;
}