Pagini recente » Cod sursa (job #1454594) | Cod sursa (job #2960505) | Cod sursa (job #1909417) | Cod sursa (job #2071105) | Cod sursa (job #1000120)
#include<stdio.h>
#include<vector>
using namespace std;
int h[300002],d[20][300002],l[100002],Log[300002],e[300002];
vector <int> v[100002];
void rmq()
{
int i,j;
Log[1]=1;
for(i=2;i<=e[0];++i)
Log[i]=Log[i/2]+1;
for(i=1;i<=e[0];++i)
d[0][i]=i;
for(i=1;(1<<i)<=e[0];++i)
for(j=1;(j+(1<<i)-1)<=e[0];++j)
if(l[d[i-1][j]]<l[d[i-1][j+(1<<(i-1))]])
d[i][j]=d[i-1][j];
else
d[i][j]=d[i-1][j+(1<<(i-1))];
}
void dfs(int x,int niv)
{
e[++e[0]]=x;
l[e[0]]=niv;
h[x]=e[0];
for(vector<int> ::iterator it=v[x].begin();it!=v[x].end();++it)
{
dfs(*it,niv+1);
e[++e[0]]=x;
l[e[0]]=niv;
}
}
inline void sol(int x,int y)
{
int aux;
x=h[x];
y=h[y];
if(x>y)
{
aux=y;
y=x;
x=aux;
}
aux=Log[y-x+1]-1;
if(l[d[aux][x]]<l[d[aux][y-(1<<aux)+1]])
printf("%d\n",e[d[aux][x]]);
else
printf("%d\n",e[d[aux][y-(1<<aux)+1]]);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,m,i,j,x,y,aux,nr;
scanf("%d%d",&n,&m);
for(i=2;i<=n;++i)
{
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1,0);
rmq();
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
sol(x,y);
}
return 0;
}