Pagini recente » Cod sursa (job #2483115) | Cod sursa (job #278042) | Cod sursa (job #1190009) | Cod sursa (job #538805) | Cod sursa (job #2572716)
#include<bits/stdc++.h>
#define lsb(i) (i&(-i))
using namespace std;
const int maxN=(1e5)+5;
int loga[maxN];
int anc[maxN][25];
vector<int> v[maxN];
int depth[maxN];
void dfs(int nod,int fat)
{
anc[nod][0]=fat;
for(int i=1;i<=20;i++)
anc[nod][i]=anc[anc[nod][i-1]][i-1];
for(auto it:v[nod])
{
if(it==fat) continue;
depth[it]=1+depth[nod];
dfs(it,nod);
}
}
inline int query(int x,int y)
{
if(depth[x]<depth[y]) swap(x,y);
int d=depth[x]-depth[y];
while(d)
{
int dd=lsb(d);
x=anc[x][loga[dd]];
d-=dd;
}
for(int i=20;i>=0;i--)
{
if(anc[x][i]!=anc[y][i])
{
x=anc[x][i];
y=anc[y][i];
}
}
if(x!=y) x=anc[x][0];
return x;
}
int n,m,t[maxN],x,y;
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&t[i]);
v[t[i]].push_back(i);
}
loga[1]=0;
for(int i=2;i<=(1<<20);i<<=1)
loga[i]=1+loga[i>>1];
dfs(1,0);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
return 0;
}