Pagini recente » Cod sursa (job #2155849) | Cod sursa (job #2978504) | Cod sursa (job #2074935) | Cod sursa (job #2858211) | Cod sursa (job #630174)
Cod sursa(job #630174)
#include <stdio.h>
#include <stdlib.h>
#define log2(n) 31-__builtin_clz(n)
typedef struct node {
int data;
struct node * next;
} node;
node * arb [100010],*k;
int n,m,i,j,fa[100010],e[200010],a[100010],b[21][200010],ul,o,lg;
void pe (int k,int n) {
e[i++]=n;
if (!fa[k]) fa[k]=i;
a[i-1]=k;
node *t=arb[k];
while (t) {
pe (t->data,n+1);
e[i++]=n;
a[i-1]=k;
t=t->next;
}
}
int main () {
FILE *in=fopen ("lca.in","r"),*out=fopen ("lca.out","w");
fscanf (in,"%d%d",&n,&m);
for (i=0; i<n-1; i++) {
fscanf (in,"%d",&j);
k=(node*) malloc (sizeof (node));
k->data=i+2;
k->next=arb[j];
arb[j]=k;
}
i=0;
pe (1,0);
for (i=0; i<2*n-1; i++) b[0][i]=i;
lg=log2(2*n-1);
for (i=1,o=1; i<=lg; i++,o<<=1) {
ul=2*n-1-o;
for (j=0; j<=ul; j++)
if (e[b[i-1][j]]<e[b[i-1][j+o]]) b[i][j]=b[i-1][j];
else b[i][j]=b[i-1][j+o];
}
for (;m;m--) {
fscanf (in,"%d%d",&i,&j);
i=fa[i]-1;
j=fa[j]-1;
if (j-i<0) { n=i; i=j; j=n; }
n=log2(j-i+1);
if (e[b[n][i]]<e[b[n][j-(1<<n)+1]]) lg=b[n][i];
else lg=b[n][j-(1<<n)+1];
fprintf (out,"%d\n",a[lg]);
}
fclose (in); fclose (out);
return 0;
}