Pagini recente » Cod sursa (job #1620397) | Cod sursa (job #84629) | Cod sursa (job #129222) | Cod sursa (job #356732) | Cod sursa (job #2374294)
#include <iostream>
#include <fstream>
#define NMAX 100005
#define INF 2000000000
using namespace std;
struct elem
{
int val,niv;
bool operator <(const elem& x2) const
{
return niv<x2.niv;
}
} d[20][NMAX];
struct nod
{
int fiu;
nod* next;
}*a[NMAX];
int n,neuler,first[NMAX];
void dfs(int x,int niv)
{
d[0][++neuler].val=x;
d[0][neuler].niv=niv;
first[x]=neuler;
for (nod *i=a[x]; i; i=i->next)
{
dfs(i->fiu,niv+1);
d[0][++neuler].val=x;
d[0][neuler].niv=niv;
}
}
int main()
{
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int m;
fin>>n>>m;
for(int i=1; i<n; i++)
{
int x;
fin>>x;
nod* nou=new nod;
nou->fiu=i+1;
nou->next=a[x];
a[x]=nou;
}
dfs(1,0);
for (int i=1;(1<<i)<=neuler;i++)
for (int j=1;j<=neuler-(1<<i)+1;j++)
d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
for (int i=1; i<=m; i++)
{
int x,y,k;
fin>>x>>y;
x=first[x];
y=first[y];
if (y<x)
{
int aux=x;
x=y;
y=aux;
}
for (k=1;(1<<k)<=y-x;k++);
k--;
if (d[k][x].niv<d[k][y-(1<<k)+1].niv)
fout<<d[k][x].val<<'\n';
else
fout<<d[k][y-(1<<k)+1].val<<'\n';
}
return 0;
}