Pagini recente » Cod sursa (job #1166601) | Cod sursa (job #2759489) | Cod sursa (job #2570457) | Cod sursa (job #378525) | Cod sursa (job #1801262)
#include <stdio.h>
#include <stdlib.h>
int st[100001][17];
int dist[100001];
int main()
{
int n,k,i,j,a,b,p;
FILE*fi,*fo;
fi=fopen("lca.in","r");
fo=fopen("lca.out","w");
fscanf(fi,"%d%d",&n,&k);
st[1][0]=1;
for(i=1;i<n;i++)
{
fscanf(fi,"%d",&st[i+1][0]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<17;j++)
st[i][j]=st[st[i][j-1]][j-1];
}
dist[1]=0;
for(i=2;i<=n;i++)
{
dist[i]=dist[st[i][0]]+1;
}
for(i=0;i<k;i++)
{
fscanf(fi,"%d%d",&a,&b);
if(dist[a]>dist[b])
{
a=a+b;
b=a-b;
a=a-b;
}
p=16;
while(p>=0 && dist[a]<dist[b])
{
if(dist[st[b][p]]>=dist[a])
{
b=st[b][p];
}
p--;
}
if(a==b)
fprintf(fo,"%d\n",a);
else {
p=16;
while(p>=0)
{
if(st[a][p]!=st[b][p])
{
a=st[a][p];
b=st[b][p];
}
p--;
}
fprintf(fo,"%d\n",st[a][0]);
}
}
fclose(fi);
fclose(fo);
return 0;
}