Pagini recente » Profil M@2Te4i | Cod sursa (job #460938) | Cod sursa (job #2209931) | Cod sursa (job #410114)
Cod sursa(job #410114)
#include<stdio.h>
#define nmax 100000
int n,m,poz,t[nmax],vec[4*nmax],niv[nmax],ap[nmax],mat[4*nmax][25],log[nmax];
struct nod
{
int inf;
nod *urm;
}*a[nmax];
void citire()
{
int x; nod *p;
freopen("lca.in","r",stdin);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
t[i]=x;
p=new nod;
p->inf=i;
p->urm=a[x];
a[x]=p;
}
}
void parcurg(int k)
{
nod *p;
vec[++poz]=k;
if(ap[k]==0)
ap[k]=poz;
if(a[k]!=NULL)
{
for(p=a[k];p!=NULL;p=p->urm)
{
niv[p->inf]=niv[k]+1;
parcurg(p->inf);
vec[++poz]=k;
}
}
}
int main()
{
freopen("lca.out","w",stdout);
citire();
parcurg(1);
log[0]=-1;
int i,j;
for(i=1;i<=poz;i++)
{
log[i]=log[i>>1]+1;
mat[i][0]=vec[i];
}
for(j=1;j<=log[poz];j++)
for(i=1;i+(1<<(j-1))<=poz;i++)
if(niv[mat[i][j-1]]<niv[mat[i+(1<<(j-1))][j-1]])
mat[i][j]=mat[i][j-1];
else
mat[i][j]=mat[i+(1<<(j-1))][j-1];
int k,x,y,ajx,ajy;
for(i=1;i<=m;i++)
{
scanf("%ld %ld",&ajx,&ajy);
if(ap[ajx]<ap[ajy])
{ x=ap[ajx];
y=ap[ajy];
}
else
{
x=ap[ajy];
y=ap[ajx];
}
k=log[y-x+1];
if(niv[mat[x][k]]<niv[mat[y-(1<<k)+1][k]])
printf("%ld\n",mat[x][k]);
else
printf("%ld\n",mat[y-(1<<k)+1][k]);
}
return 0;
}