Pagini recente » Cod sursa (job #685602) | Cod sursa (job #2739765) | Cod sursa (job #2508464) | Cod sursa (job #1331300) | Cod sursa (job #1165324)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int nmax = 100005;
const int lmax = 17;
int n,q,x,y,i,j,dif,f[lmax][nmax],lev[nmax];
vector<int> v[nmax];
void dfs(int x)
{
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
{
lev[*it]=lev[x]+1;
dfs(*it);
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&q);
for(i=2;i<=n;i++)
{
scanf("%d",&f[0][i]);
v[f[0][i]].push_back(i);
}
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
f[i][j]=f[i-1][f[i-1][j]];
lev[1]=1; dfs(1);
for(;q;q--)
{
scanf("%d%d",&x,&y);
if(lev[x]>lev[y]) swap(x,y);
dif=lev[y]-lev[x];
for(i=0;i<17;i++)
if((1<<i)&dif) y=f[i][y];
if(x==y) {printf("%d\n",x); continue;}
for(i=16;i>=0;i--)
if(f[i][x]!=f[i][y])
{
x=f[i][x];
y=f[i][y];
}
printf("%d\n",f[0][x]);
}
return 0;
}