Pagini recente » Cod sursa (job #147087) | Monitorul de evaluare | Cod sursa (job #3264490) | Cod sursa (job #1974866) | Cod sursa (job #3244024)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
int t,n,m,i,k,j,nivel[100005],parent[100005][18],x,y,ok,d,q,l,r,mij,sum,nr,maxnr,minnr,maxp,minp;
vector<int>g[100005];
void dfs(int nod, int niv)
{
nivel[nod]=nivel[niv]+1;
parent[nod][0]=niv;
for(i=1;i<=17; i++)
parent[nod][i]=parent[parent[nod][i-1]][i-1];
for(auto it:g[nod])
{
if(it!=niv)
dfs(it, nod);
}
}
int lca(int x, int y)
{
if(nivel[x]<nivel[y])
swap(x,y);
for(int i=17;i>=0;i--)
{
if(nivel[x]-(1<<i)>=nivel[y])
x=parent[x][i];
}
if(x==y)
return x;
for(int i=17;i>=0;i--)
{
if(parent[x][i]!=parent[y][i])
{
x=parent[x][i];
y=parent[y][i];
}
}
return parent[x][0];
}
int main()
{
cin>>n>>m;
for(i=2; i<=n; i++)
{
cin>>x;
g[x].push_back(i);
g[i].push_back(x);
}
dfs(1, 0);
for(i=1; i<=m; i++)
{
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}