Pagini recente » Cod sursa (job #1549508) | Cod sursa (job #43246) | Cod sursa (job #2892640) | Cod sursa (job #1949376) | Cod sursa (job #2275470)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=100001;
const int L=18;
vector<int>f[N];
int n,m,ne,e[2*N],poz[N],nivel[N],root,log2[2*N],r[L][N];
void dfs(int x)
{
e[++ne]=x;
poz[x]=ne;
for(auto y:f[x])
{
nivel[y]=1+nivel[x];
dfs(y);
e[++ne]=x;
}
}
int main()
{
in>>n>>m;
int x,st,dr,sol,k;
for(int i=2;i<=2*(n+1);i++)
log2[i]=1+log2[i/2];
for(int i=2;i<=n;i++)
{
in>>x;
f[x].push_back(i);
}
dfs(1);
for(int j=1;j<=ne;j++)
{
r[0][j]=e[j];
//out<<r[0][j]<<' ';
}
//out<<'\n';
for(int i=1;i<=log2[ne];i++)
for(int j=(1<<i);j<=ne;j++)
{
st=r[i-1][j-(1<<(i-1))];
dr=r[i-1][j];
if(nivel[st]<=nivel[dr])
r[i][j]=st;
else
r[i][j]=dr;
}
for(int i=1;i<=m;i++)
{
in>>st>>dr;
st=poz[st];
dr=poz[dr];
if(st>dr)
swap(st,dr);
//out<<st<<' '<<dr<<' ';
k=log2[dr-st+1];
st=r[k][st+(1<<k)-1];
dr=r[k][dr];
if(nivel[st]<=nivel[dr])
sol=st;
else
sol=dr;
out<<sol<<'\n';
}
return 0;
}