Pagini recente » Cod sursa (job #1309482) | Cod sursa (job #1504023) | Cod sursa (job #1348356) | Cod sursa (job #2427477) | Cod sursa (job #1070874)
#include <fstream>
#include <math.h>
#define qu 100001
int a[17][qu];
int nivel[qu];
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int log2(int x)
{int q=1,n=0;
while (q<=x)
{
q=q<<1;
n++;
}
return n-1;
}
int nivelare(int x,int p)
{int l;
while (p!=0)
{l=log2(p);
x=a[l][x];
if (x==0) return x;
p-=(1<<l);}
return x;
}
int cautare(int x,int y)
{int i=0;
while (a[0][x]!=a[0][y])
{i=0;
while (a[i+1][x]!=a[i+1][y])
{
x=a[i][x];
y=a[i][y];
++i;
}
x=a[0][x];
y=a[0][y];
}
return a[0][x];
}
int main()
{int n,m,i,l,x,y,d,mij,j,p;
f>>n>>m;
nivel[1]=0;
a[0][1]=0;
for (i=2;i<=n;++i)
{
f>>a[0][i];
nivel[i]=nivel[a[0][i]]+1;
}
for (i=1;(1<<i)<=n;i++)
for (j=1;j<=n;j++) a[i][j]=a[i-1][a[i-1][j]];
//for (i=2;i<=n;++i) g<<a[0][i]<<' ';
for (i=0;i<m;++i)
{
f>>x>>y;
p=nivel[x]-nivel[y];
if (p<0) y=nivelare(y,abs(p));
else if (p>0) x=nivelare(x,p);
p=nivel[x];
if (x==y) g<<x<<' '<<"\n";
else
g<<cautare(x,y)<<"\n";
}
return 0;
}