Pagini recente » Cod sursa (job #3150144) | Cod sursa (job #2130244) | Cod sursa (job #506671) | Cod sursa (job #897881) | Cod sursa (job #1389735)
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
#define pb push_back
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,t[100005],T2[100005],h,nn[100005];
vector<int> v[100005];
int adancime(int i);
int lca(int x, int y);
void df(int i,int t2,int niv);
int main()
{
in>>n>>m;
int i,a,b;
for(i=2;i<=n;++i)
{
in>>a;
v[a].pb(i);
t[i]=a;
}
h=sqrt(adancime(1));
df(1,0,1);
while(m--)
{
in>>a>>b;
out<<lca(a,b)<<'\n';
}
}
int lca(int x, int y)
{
while(T2[x]!=T2[y])
{
if(nn[x]>nn[y]) x=T2[x];
else y=T2[y];
}
while(x!=y)
{
if(nn[x]>nn[y]) x=t[x];
else y=t[y];
}
return x;
}
void df(int i,int t2,int niv)
{
if(niv%h==0) t2=t[i];
nn[i]=niv;
T2[i]=t2;
vector<int> :: iterator it;
for(it=v[i].begin();it!=v[i].end();++it)
{
df(*it,t2,niv+1);
}
}
int adancime(int i)
{
int r=0,a;
vector<int> :: iterator it;
for(it=v[i].begin();it!=v[i].end();++it)
{
a=adancime(*it);
if(r<a) r=a;
}
return r+1;
}