Pagini recente » Cod sursa (job #1161565) | Cod sursa (job #2361459) | Cod sursa (job #2147750) | Cod sursa (job #1462135) | Cod sursa (job #1228617)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>v[100010];
int v1[200010],niv[200010],first[100010],sol[20][100010],lg[200010],n,m,i,j,x,y,nr,lim,a;
void dfs(int nod,int lev)
{
vector<int>::iterator it;
v1[++nr]=nod;
niv[nr]=lev;
first[nod]=nr;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
dfs(*it,lev+1);
v1[++nr]=nod;
niv[nr]=lev;
}
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1,0);
for(i=2;i<=nr;i++) lg[i]=lg[i/2]+1;
for(i=1;i<=nr;i++) sol[0][i]=i;
for(i=1,x=2;x<=nr;i++,x<<=1)
{
lim=nr-x+1;
for(j=1;j<=lim;j++)
if(niv[sol[i-1][j]]<niv[sol[i-1][j+x/2]]) sol[i][j]=sol[i-1][j];
else sol[i][j]=sol[i-1][j+x/2];
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=first[x];
y=first[y];
if(x>y) swap(x,y);
lim=lg[y-x+1];
if(niv[sol[lim][x]]<niv[sol[lim][y-(1<<lim)+1]]) a=sol[lim][x];
else a=sol[lim][y-(1<<lim)+1];
printf("%d\n",v1[a]);
}
return 0;
}