Pagini recente » Cod sursa (job #2934787) | Cod sursa (job #2509070) | Cod sursa (job #2171783) | Cod sursa (job #850412) | Cod sursa (job #1985305)
#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);
if((in[a]<=ie[b] && ie[a]>=ie[b]) || (in[a]<=in[b] && ie[a]>=in[b]))
fprintf(fo,"%d\n",a);
else {
a+=b;
b=a-b;
a=a-b;
if((in[a]<=ie[b] && ie[a]>=ie[b]) || (in[a]<=in[b] && ie[a]>=in[b]))
fprintf(fo,"%d\n",a);
else
{
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;
}