Pagini recente » Cod sursa (job #1136671) | Cod sursa (job #2187457) | Cod sursa (job #2853403) | Rating Marin Ionut Cristian (cristy_marin2006) | Cod sursa (job #1546926)
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int d[100001];
void depth(int nod){
if(d[nod]==0){
depth(v[nod]);
d[nod]=d[v[nod]]+1;
}
}
int main()
{
int n, m, i;
int u, w, f;
FILE*fi=fopen("lca.in","r"), *fo=fopen("lca.out","w");
fscanf(fi,"%d%d", &n, &m);
f=1;
for(i=2;i<=n;i++){
fscanf(fi,"%d", &v[i]);
if(v[i]!=i-1)
f=0;
}
d[1]=1;
for(i=2;i<=n;i++)
depth(i);
if(f!=1)
for(i=0;i<m;i++){
fscanf(fi,"%d%d", &u, &w);
while(d[u]<d[w])
w=v[w];
while(d[w]<d[u])
u=v[u];
while(u!=w){
u=v[u];
w=v[w];
}
fprintf(fo,"%d\n", u);
}
else
for(i=0;i<m;i++){
fscanf(fi,"%d%d", &u, &w);
if(u<=w)
fprintf(fo,"%d\n", u);
else
fprintf(fo,"%d\n", w);
}
fclose(fi);
fclose(fo);
return 0;
}