Pagini recente » Cod sursa (job #2445257) | Cod sursa (job #2260588) | Cod sursa (job #643136) | Statistici Baloi Bogdan (lorddemigod) | Cod sursa (job #2368489)
#include <bits/stdc++.h>
using namespace std;
vector<int>v[100010];
int d[200005][22];
int p[100010];
int e[200005];
int a[200005];
int nr;
void df(int o,int ad){
e[++nr]=o;
a[nr]=ad;
p[o]=nr;
int l=v[o].size();
for (int i=0;i<l;i++)
{
df(v[o][i],ad+1);
e[++nr]=o;
a[nr]=ad;
}
}
int main()
{
int n,m,i,x,y,j;
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);
}
df(1,0);
for (i=1;i<=nr;i++) d[i][0]=e[i];
for (j=1;(1<<j)<=nr;j++){
for (i=1;i+(1<<j)-1<=nr;i++){
if (a[p[d[i][j-1]]]>a[p[d[i+(1<<(j-1))][j-1]]]) d[i][j]=d[i+(1<<(j-1))][j-1];
else d[i][j]=d[i][j-1];
}
}
for (i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if (p[x]>p[y]) swap(x,y);
int k=log2(p[y]-p[x]+1);
if (a[p[d[p[x]][k]]]>a[p[d[p[y]-(1<<k)+1][k]]]) printf("%d\n",d[p[y]-(1<<k)+1][k]);
else printf("%d\n",d[p[x]][k]);
}
return 0;
}