Pagini recente » Cod sursa (job #3213141) | Cod sursa (job #774341) | Cod sursa (job #13475) | Cod sursa (job #2921188) | Cod sursa (job #1146837)
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int parcurgere[20][7000000],lim,j,nr,n,m,poz[200100];
vector <int> vecini[200100];
void dfs(int tata)
{
int i,fiu;
parcurgere[1][++nr]=tata;
poz[tata]=nr;
for(i=0;i<vecini[tata].size();i++)
{
fiu=vecini[tata][i];
dfs(fiu);
parcurgere[1][++nr]=tata;
}
}
int main()
{
int x,i,k;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<n;i++)
{
scanf("%d",&x);
vecini[x].push_back(i+1);
}
dfs(1);
parcurgere[1][0]=nr;
i=2;
for(k=2;i<=nr;k++)
{
lim=parcurgere[k-1][0]-i/2;
for(j=1;j<=lim;j++)
{
parcurgere[k][j]=min(parcurgere[k-1][j],parcurgere[k-1][j+i/2]);
}
parcurgere[k][0]=lim;
i=1<<k;
}
for(i=1;i<=lim;i++)
{
parcurgere[k][i]=1;
}
int a,b,y,rez,p;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(a!=b)
{
x=min(poz[a],poz[b]);
y=max(poz[a],poz[b]);
lim=y-x-1;
lim=log2(lim);
p=1<<lim;
rez=min(parcurgere[lim+1][x],parcurgere[lim+1][y-p]);
printf("%d\n",rez);
}
else
printf("%d\n",a);
}
return 0;
}