Pagini recente » Cod sursa (job #249718) | Cod sursa (job #2101112) | Cod sursa (job #550909) | Cod sursa (job #952507) | Cod sursa (job #3322728)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,q;
vector<int> G[100005];
int anc[20][100005],niv[100005];
void dfs(int x,int tata,int h)
{
niv[x]=h;
for(auto y:G[x])
{
if(y==tata)
continue;
dfs(y,x,h+1);
}
}
int LCA(int x,int y)
{
if(niv[x]<niv[y])
swap(x,y);
int dif=niv[x]-niv[y];
for(int i=0;i<=18;i++)
if(dif&(1<<i))
x=anc[i][x];
if(x==y) return x;
for(int i=18;i>=0;i--)
{
if(anc[i][x]!=anc[i][y])
{
x=anc[i][x];
y=anc[i][y];
}
}
return anc[0][x];
}
int main()
{
cin>>n>>q;
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
anc[0][i]=x;
G[i].push_back(x);
G[x].push_back(i);
}
dfs(1,0,1);
for(int i=1;i<=18;i++)
for(int j=1;j<=n;j++)
anc[i][j]=anc[i-1][anc[i-1][j]];
while(q--)
{
int x,y;
cin>>x>>y;
cout<<LCA(x,y)<<"\n";
}
return 0;
}