Pagini recente » Cod sursa (job #2037803) | Cod sursa (job #1660183) | Cod sursa (job #2893829) | Cod sursa (job #1314286) | Cod sursa (job #2480517)
#include <bits/stdc++.h>
using namespace std;
ifstream inf("lca.in");
ofstream outf("lca.out");
const int N=100010;
int n, m, x, y, i, st, dr, mi, p, P, k, sol;
vector<int> v[N];
int r[20][2*N], pr[N], niv[N];
void dfs(int, int);
int main()
{
inf>>n>>m;
for(int i=2; i<=n; i++)
{
inf>>x;
v[x].push_back(i);
v[i].push_back(x);
}
dfs(1,0);
for(i=1, p=1, P=2; P<=k; i++,p*=2,P*=2)
for(st=1,mi=p+1,dr=P; dr<=k; st++,mi++,dr++)
r[i][st]=(niv[r[i-1][st]]<niv[r[i-1][mi]])?r[i-1][st]:r[i-1][mi];
for(;m;m--)
{
inf>>st>>dr;
st=pr[st];
dr=pr[dr];
if(st>dr)
swap(st,dr);
i=31-__builtin_clz(dr-st+1);
p=1<<i;
dr=dr-p+1;
sol=(niv[r[i][st]]<niv[r[i][dr]])?r[i][st]:r[i][dr];
outf<<sol<<'\n';
}
return 0;
}
void dfs(int nod, int tata)
{
niv[nod]=niv[tata]+1;
r[0][++k]=nod;
pr[nod]=k;
for(auto it:v[nod])
if(it!=tata)
{
dfs(it, nod);
r[0][++k]=nod;
}
}