Pagini recente » Cod sursa (job #2791859) | Cod sursa (job #650234) | Cod sursa (job #1043723) | Cod sursa (job #3274986) | Cod sursa (job #2812123)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int MAX=100005;
const int LOG=18;
int n,m,eul[2*MAX],niv[2*MAX],poz[2*MAX],log2[2*MAX],rmq[LOG][2*MAX],k;
vector < int > v[MAX];
void dfs(int vf, int lev)
{
eul[++k]=vf;
niv[k]=lev;
poz[vf]=k;
for(auto x : v[vf])
{
dfs(x,lev+1);
eul[++k]=vf;
niv[k]=lev;
}
}
int main()
{
fin >> n >> m;
for(int i=2;i<=n;i++)
{
int x;
fin >> x;
v[x].push_back(i);
}
dfs(1,0);
log2[1]=0;
for(int i=2;i<=k;i++)
log2[i]=log2[i>>1]+1;
for(int i=1;i<=k;i++)
rmq[0][i]=i;
int len=log2[k];
for(int i=1;i<=len;i++)
{
int sf=k-(1<<i)+1;
int p=1<<(i-1);
for(int j=1;j<=sf;j++)
{
rmq[i][j]=rmq[i-1][j];
if(niv[rmq[i-1][j+p]]<niv[rmq[i-1][j]])
rmq[i][j]=rmq[i-1][j+p];
}
}
for(;m;--m)
{
int x,y,st,dr,l,dif;
fin >> x >> y;
st=poz[x];
dr=poz[y];
if(st>dr)
swap(st,dr);
l=log2[dr-st+1];
dif=(1<<l)-1;
if(niv[rmq[l][st]]<niv[rmq[l][dr-dif]])
fout << eul[rmq[l][st]] << '\n';
else
fout << eul[rmq[l][dr-dif]] << '\n';
}
return 0;
}