Pagini recente » Cod sursa (job #3170251) | Cod sursa (job #2944806) | Cod sursa (job #2845430) | Cod sursa (job #2822185) | Cod sursa (job #2786628)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
vector<int> ad[100001];
int v[100001],euler[200001],h[200001],mq[18][200001],pe=0,le[200001];
void dfs(int nod,int he)
{
le[nod]=pe;
euler[pe]=nod;
h[pe]=he;
pe++;
for(int i=0; i<ad[nod].size(); i++)
{
dfs(ad[nod][i],he+1);
le[nod]=pe;
euler[pe]=nod;
h[pe]=he;
pe++;
}
}
void rmq()
{
for(int i=1; i<pe; i++)
mq[0][i]=i;
for(int i=1; (1<<i)<=pe; i++)
{
for(int j=1; j<=pe; j++)
{
if(h[mq[i-1][j]]<h[mq[i-1][j+(1<<(i-1))]])
mq[i][j]=mq[i-1][j];
else
mq[i][j]=mq[i-1][j+(1<<(i-1))];
}
}
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,k,a,i,b,dif,p,ml1,ml2;
cin>>n>>k;
for(i=2; i<=n; i++)
{
cin>>v[i];
ad[v[i]].push_back(i);
}
dfs(1,0);
rmq();
for(i=1; i<=k; i++)
{
cin>>a>>b;
ml1=min(le[a],le[b]);
ml2=max(le[a],le[b]);
dif=ml2-ml1+1;
dif=log2(dif);
if(h[mq[dif][ml1]]<h[mq[dif][ml2-(1<<dif)+1]])
cout<<euler[mq[dif][ml1]]<<'\n';
else
cout<<euler[mq[dif][ml2-(1<<dif)+1]]<<'\n';
}
return 0;
}