Pagini recente » Cod sursa (job #1318798) | Cod sursa (job #1353356) | Cod sursa (job #1402550) | Cod sursa (job #652318) | Cod sursa (job #2213772)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int N=100010;
int n,m,i,j,e,p,k,rmq[19][2*N],niv[N],pa[N],E[2*N],x,y,l,st,mi,dr,d;
vector<int> v[N];
void dfs(int,int);
int main()
{
f>>n>>m;
for(int i=2;i<=n;i++)
{
f>>j;
v[j].push_back(i);
}
dfs(1,1);
e=18;
p=1<<e;
while(p>k)
{
e--;
p>>=1;
}
for(i=2;i<=k;i<<=1)
E[i]=1;
for(i=2;i<=k;i++)
E[i]+=E[i-1];
for(i=1,p=1;i<=e;i++)
for(st=1,dr=2*p,mi=p+1;dr<=k;st++,mi++,dr++)
rmq[i][st]=niv[rmq[i-1][st]]<niv[rmq[i-1][mi]]?rmq[i-1][st]:rmq[i-1][mi];
for(;m;m--)
{
f>>i>>j;
i=pa[i];
j=pa[j];
if(i>j)
swap(i,j);
d=j-i+1;
l=E[d];
p=1<<l;
x=rmq[l][i];
y=rmq[l][j-p+1];
x=(niv[y]<niv[x])?y:x;
g<<x<<"\n";
}
return 0;
}
void dfs(int nod,int nivel)
{
niv[nod]=nivel;
rmq[0][++k]=nod;
pa[nod]=k;
for(auto vec:v[nod])
{
dfs(vec,nivel+1);
rmq[0][++k]=nod;
}
}