Pagini recente » Cod sursa (job #2254881) | Cod sursa (job #2093016) | Cod sursa (job #1226148) | Cod sursa (job #580472) | Cod sursa (job #3280807)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[100005];
int n,m,i,j,k,d[200005][20],poz[100005],e[200005][20],x,p,y;
void dfs(int nod,int h)
{
d[++k][0]=h;
if(!poz[nod])
poz[nod]=k;
e[k][0]=nod;
for(int i=0;i<v[nod].size();i++)
{
dfs(v[nod][i],h+1);
d[++k][0]=h;
e[k][0]=nod;
}
}
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
dfs(1,1);
for(j=1;(1<<j)<=k;j++)
for(i=1;i+(1<<j)-1<=k;i++)
{
if(d[i][j-1]<d[i+(1<<(j-1))][j-1])
{
d[i][j]=d[i][j-1];
e[i][j]=e[i][j-1];
}
else
{
d[i][j]=d[i+(1<<(j-1))][j-1];
e[i][j]=e[i+(1<<(j-1))][j-1];
}
}
for(i=1;i<=m;i++)
{
f>>x>>y;
int x1=poz[x];
int y1=poz[y];
if(x1>y1)
swap(x1,y1);
p=log2(y1-x1+1);
if(d[x1][p]<d[y1-(1<<p)+1][p])
g<<e[x1][p]<<'\n';
else
g<<e[y1-(1<<p)+1][p]<<'\n';
}
return 0;
}