Pagini recente » Cod sursa (job #2297370) | Cod sursa (job #271583) | Cod sursa (job #1551423) | Cod sursa (job #1558516) | Cod sursa (job #729648)
Cod sursa(job #729648)
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#define NMax 100005
using namespace std;
int first[NMax],eu[2*NMax];
int niv[2*NMax],m[2*NMax][20];
vector <int> a[NMax];
int k,n,mm;
void citire ()
{
int i,x;
scanf("%d%d",&n,&mm);
for (i=2; i<=n; i++)
{
scanf("%d",&x);
a[x].push_back(i);
}
}
void df_euler (int nod, int lev)
{
eu[++k]=nod;
niv[k]=lev;
first[nod]=k;
for (int i=0; i<a[nod].size(); i++)
{
df_euler(a[nod][i],lev+1);
eu[++k]=nod;
niv[k]=lev;
}
}
void rmq ()
{
int i,j,aux;
for (i=1; i<=k; i++)
m[i][0]=i;
for (j=1; (1<<j)<k; j++)
for (i=1; i+(1<<j)-1<=k; i++)
{
aux=1<<(j-1);
m[i][j]=m[i][j-1];
if (niv[m[i][j]] > niv[m[i+aux][j-1]])
m[i][j]=m[i+aux][j-1];
}
}
int lca (int x, int y)
{
int p1,p2,ka,sol;
p1=first[x]; p2=first[y];
if (p1>p2) swap(p1,p2);
ka=log10(p2-p1+1)/log10(2);
sol=m[p1][ka];
if (niv[m[p2-(1<<ka)+1][ka]]<niv[sol])
sol=m[p2-(1<<ka)+1][ka];
return eu[sol];
}
int main ()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int x,y;
citire();
df_euler(1,0);
rmq();
for (int i=1; i<=mm; i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}