Pagini recente » Cod sursa (job #1207553) | Cod sursa (job #186797) | Cod sursa (job #235288) | Cod sursa (job #102864) | Cod sursa (job #3344182)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int lim=1e5+10;
int n,Q,i,m,d[lim],first[lim],aint[16*lim];
vector <int> v[lim];
vector <int> e;
void euler(int k)
{
e.push_back(k);
for(auto x:v[k])
{
d[x]=d[k]+1;
euler(x);
e.push_back(k);
}
}
int query(int l,int r)
{
l+=m;r+=m;
int ans=0,mn=1e9;
while(l<=r)
{
if(l%2)
{
if(mn>d[aint[l]])
{
mn=d[aint[l]];
ans=aint[l];
}
}
if(!(r%2))
{
if(mn>d[aint[r]])
{
mn=d[aint[r]];
ans=aint[r];
}
}
l=(l+1)/2;
r=(r-1)/2;
}
return ans;
}
int main()
{
fin>>n>>Q;
for(i=2;i<=n;i++)
{
int x;
fin>>x;
v[x].push_back(i);
}
euler(1);
for(i=1;i<=n;i++)
first[i]=-1;
m=e.size();
for(auto x=0;x<m;x++)
{
if(first[e[x]]==-1)first[e[x]]=x;
}
for(i=0;i<m;i++)
aint[i+m]=e[i];
for(i=m-1;i>0;i--)
{
if(d[aint[2*i]]<d[aint[2*i+1]])
aint[i]=aint[2*i];
else aint[i]=aint[2*i+1];
}
while(Q--)
{
int l,r;
fin>>l>>r;
l=first[l];
r=first[r];
if(l>r)swap(l,r);
fout<<query(l,r)<<'\n';
}
return 0;
}