Pagini recente » Cod sursa (job #2602882) | Cod sursa (job #399368) | Cod sursa (job #555133) | Cod sursa (job #652901) | Cod sursa (job #1985282)
#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++){
j=1;
while(t[t[i][j-1]][j-1]!=0){
t[i][j]=t[t[i][j-1]][j-1];
j++;
}
}
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--;
}
fprintf(fo,"%d\n",t[a][0]);
}
fclose(fi);
fclose(fo);
return 0;
}