Pagini recente » Cod sursa (job #2917894) | Cod sursa (job #3142978) | Cod sursa (job #155516) | Cod sursa (job #1071717) | Cod sursa (job #1646837)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> v[100010];
int niv[100010],rmq[20][200010],log[200010],first[100010],nr;
void dfs(int nod,int lev)
{
niv[nod]=lev;
rmq[0][++nr]=nod;
first[nod]=nr;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
rmq[0][++nr]=nod;
dfs(*it,lev+1);
}
}
int lca(int x,int y)
{
x=first[x];y=first[y];
if(x>y) swap(x,y);
int lim=log[y-x+1];
if(niv[rmq[lim][x]]<niv[rmq[lim][y-(1<<lim)+1]]) return rmq[lim][x];
else return rmq[lim][y-(1<<lim)+1];
}
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=2;i<=n;i++)
{
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1,1);
for(int i=2;i<=nr;i++) log[i]=log[i/2]+1;
for(int i=1;i<=log[nr];i++)
{
int lim=nr-(1<<i)+1;
for(int j=1;j<=lim;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);
printf("%d\n",lca(x,y));
}
return 0;
}