Pagini recente » Cod sursa (job #1640936) | Cod sursa (job #1204249) | Cod sursa (job #1336392) | Cod sursa (job #1302997) | Cod sursa (job #2164856)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100010
int t[NMAX],euler[2*NMAX],nr,n,m,nivel[2*NMAX],prima[NMAX],a[2*NMAX][30];
vector<int> v[NMAX];
void df(int nod, int niv){
euler[++nr]=nod;
nivel[nr]=niv;
if (!prima[nod]) prima[nod]=nr;
int l=v[nod].size();
for (int i=0;i<l;i++){
if (!prima[v[nod][i]]){
df(v[nod][i],niv+1);
euler[++nr]=nod;
nivel[nr]=niv;
}
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int i,r,x,j,y;
scanf("%d%d",&n,&m);
t[1]=1;
for (i=2;i<=n;i++){
scanf("%d",&t[i]);
v[t[i]].push_back(i);
}
df(1,0);
for (i=1;i<=nr;i++) a[i][0]=i;
r=log2(nr);
for (j=1;j<=r;j++)
for (i=1;i<=nr-(1<<j)+1;i++){
if (nivel[a[i][j-1]]>nivel[a[i+(1<<(j-1))][j-1]])
a[i][j]=a[i+(1<<(j-1))][j-1];
else a[i][j]=a[i][j-1];
}
for (i=1;i<=m;i++){
scanf("%d%d",&x,&y);
x=prima[x];
y=prima[y];
if (x>y) swap(x,y);
r=log2(y-x+1);
if (nivel[a[x][r]]>nivel[a[y-(1<<r)+1][r]])
printf("%d\n",euler[a[y-(1<<r)+1][r]]);
else printf("%d\n",euler[a[x][r]]);
}
return 0;
}