Pagini recente » Cod sursa (job #2279998) | Cod sursa (job #2183218) | Cod sursa (job #2672771) | Cod sursa (job #2295526) | Cod sursa (job #1070033)
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h>
using namespace std;
const int nmax = 258000,lgmax=20;
//vector < int > a[nmax];
int n,m,T[nmax],P[lgmax][nmax];//,h=0;
void dfs(int P[lgmax][nmax]){
int i,j;
// for(j=1;1<<j<=n;j++)
// for(i=0;i<=n;i++)
// P[j][i]=-1;
// P[0][0]=0;
// for(i=1;i<=n;i++)P[0][i]=T[i];
for(j=1;1<<j<=n;j++)
for(i=1;i<=n;i++)
// if(P[j-1][i]!=-1 )
P[j][i] = P[j-1][P[j-1][i]];
}
int lca(int x,int y,int T[nmax],int P[lgmax][nmax]){//x-nodul y al citilea stamos
int log;
// for(log=1;1<<log<=y;log++);log--;
// if(P[log][x]!=-1){
// x=P[log][x];
// y-=1<<log;
// } //return y;
while(y>0){
for(log=1;1<<log<=y;log++);log--;
x=P[log][x];
if(x==0)break;
y-=1<<log;
}
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;
for(int i=1;i<=n;i++){
scanf("%d",&P[0][i]);
}
dfs(P);
/* 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,T,P));
}
fclose(stdout); fclose(stdin);
return 0;
}