Pagini recente » Cod sursa (job #527315) | Cod sursa (job #2333384) | Cod sursa (job #2891086) | Cod sursa (job #1425379) | Cod sursa (job #1985307)
#include <stdio.h>
#include <stdlib.h>
int lst[100001], urm[100001], f[100001], timp, v[100001], s[100001][17], ti[100001], to[100001];
void dfs(int x){
int y, p;
ti[x]=++timp;
p=lst[x];
while(p!=0){
y=f[p];
dfs(y);
p=urm[p];
}
to[x]=++timp;
}
int intreb(int x, int y){
int pas=16, z;
if (ti[x]<=ti[y] && to[y]<=to[x])
return x;
else if (ti[y]<=ti[x] && to[x]<=to[y])
return y;
while(pas>=0){
z=s[x][pas];
if(z!=0 && (ti[z]>to[y] || to[z]<ti[y]))
x=z;
pas--;
}
return s[x][0];
}
int main(){
FILE *fin, *fout;
int n, m, y, i, a, b, nr, j;
fin=fopen("lca.in", "r");
fout=fopen("lca.out", "w");
fscanf(fin, "%d%d", &n, &m);
y=1;
for(i=2;i<=n;i++){
fscanf(fin, "%d", &nr);
s[i][0]=nr;
f[y]=i;
urm[y]=lst[nr];
lst[nr]=y;
y++;
}
dfs(1);
for(j=1;j<17;j++)
for(i=2;i<=n;i++)
s[i][j]=s[s[i][j-1]][j-1];
for(i=0;i<m;i++){
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", intreb(a, b));
}
fclose(fin);
fclose(fout);
return 0;
}