Pagini recente » Cod sursa (job #3220283) | Cod sursa (job #623242) | Cod sursa (job #644358) | Cod sursa (job #3275384) | Cod sursa (job #1985292)
#include <stdio.h>
#include <stdlib.h>
int t[100001][17],f[100001][2],lst[100001],in[100001],ie[100001];
int nr=1;
void fn(int nod){
int x=lst[nod];
in[nod]=nr;
nr++;
while(f[x][0]!=0){
fn(f[x][0]);
x=f[x][1];
}
ie[nod]=nr;
nr++;
}
int main()
{
int n,q,i,k=1,j,a,b,p,x,z;
FILE*fi,*fo;
fi=fopen("lca.in","r");
fo=fopen("lca.out","w");
fscanf(fi,"%d%d",&n,&q);
for(i=2;i<=n;i++){
fscanf(fi,"%d",&t[i][0]);
f[k][0]=i;
f[k][1]=lst[t[i][0]];
lst[t[i][0]]=k;
k++;
}
fn(1);
for(i=1;i<=n;i++){
for(j=1;j<17;j++){
t[i][j]=t[t[i][j-1]][j-1];
}
}
for(i=0;i<q;i++){
fscanf(fi,"%d%d",&a,&b);
p=16;
while(p>=0){
z=t[a][p];
if(z!=0 && (in[z]>ie[b] || ie[z]<in[b]))
a=z;
p--;
}
if((in[a]<=ie[b] && ie[a]>=ie[b]) || (in[a]<=in[b] && ie[a]>=in[b]))
fprintf(fo,"%d\n",a);
else fprintf(fo,"%d\n",t[a][0]);
}
fclose(fi);
fclose(fo);
return 0;
}