Pagini recente » Cod sursa (job #1294760) | Cod sursa (job #429542) | Cod sursa (job #938944) | Cod sursa (job #788136) | Cod sursa (job #2438839)
#include <stdio.h>
#define MAXN 100000
#define MAXH 18
FILE *fin,*fout;
int n,v[MAXN+1],next[MAXN+1];
int k,fap[MAXN+1],log2[2*MAXN-1],p2[2*MAXN-1];
struct{
int nod,h;
}e[2*MAXN-1][MAXH];
void dfs(int nod, int ha){
if(!fap[nod])
fap[nod]=k;
e[k][0].nod=nod;
e[k++][0].h=ha;
int i=v[nod];
while(i){
dfs(i,ha+1);
e[k][0].nod=nod;
e[k++][0].h=ha;
i=next[i];
}
}
void rmq(){
for(int p=1; p<MAXH; p++)
for(int i=0; i+(1<<p)<=k; i++){
e[i][p].nod=e[i][p-1].nod;
e[i][p].h=e[i][p-1].h;
if(e[i][p].h>e[i+(1<<(p-1))][p-1].h){
e[i][p].nod=e[i+(1<<(p-1))][p-1].nod;
e[i][p].h=e[i+(1<<(p-1))][p-1].h;
}
}
}
void log(int k){
for(int i=2; i<k; i++){
log2[i]=log2[i/2]+1;
p2[i]=(1<<log2[i]);
}
}
int lca(int x, int y){
if(x==y)
return e[x][0].nod;
if(x>y){
int aux=x;
x=y;
y=aux;
}
int l=log2[y-x+1],p=p2[y-x+1];
if(e[x][l].h<e[y-p+1][l].h)
return e[x][l].nod;
return e[y-p+1][l].nod;
}
int main(){
fin=fopen("lca.in","r");
fout=fopen("lca.out","w");
int m,i,parinte,x,y;
fscanf(fin,"%d%d",&n,&m);
for(i=2; i<=n; i++){
fscanf(fin,"%d",&parinte);
next[i]=v[parinte];
v[parinte]=i;
}
dfs(1,0);
rmq();
log(k);
for(i=0; i<m; i++){
fscanf(fin,"%d%d",&x,&y);
fprintf(fout,"%d\n",lca(fap[x],fap[y]));
}
fclose(fin);
fclose(fout);
return 0;
}