Pagini recente » Cod sursa (job #1919520) | Cod sursa (job #947587) | Cod sursa (job #1603592) | Cod sursa (job #1775027) | Cod sursa (job #2376475)
#include <bits/stdc++.h>
using namespace std;
int niv[100010],first[100010],rmq[19][200010],logg[200010],l;
vector<int> v[100010];
void dfs(int nod,int nivel)
{
niv[nod]=nivel;
rmq[0][++l]=nod;
first[nod]=l;
for(int i=0;i<v[nod].size();i++)
{
dfs(v[nod][i],nivel+1);
rmq[0][++l]=nod;
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d",&x);
v[x].push_back(i+1);
}
dfs(1,0);
for(int i=2;i<=l;i++) logg[i]=logg[i/2]+1;
for(int i=1;i<=logg[l];i++)
for(int j=1;j+(1<<i)-1<=l;j++)
if(niv[rmq[i-1][j]]<niv[rmq[i-1][j+(1<<(i-1))]]) rmq[i][j]=rmq[i-1][j];
else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=first[x];y=first[y];
if(x>y) swap(x,y);
int l1=logg[y-x+1];
if(niv[rmq[l1][x]]<niv[rmq[l1][y-(1<<l1)+1]]) printf("%d\n",rmq[l1][x]);
else printf("%d\n",rmq[l1][y-(1<<l1)+1]);
}
return 0;
}