Pagini recente » Cod sursa (job #572648) | Clasament r0 | Cod sursa (job #1916918) | Cod sursa (job #2922896) | Cod sursa (job #2470447)
#include <bits/stdc++.h>
using namespace std;
/// lowest common ancestor
int n,s;
const int NMAX=100000;
int parent[NMAX+5],sqparent[NMAX+5],depth[NMAX+5];
int depth_max=0;
int h;
vector<int>v[NMAX+5];
void dfs(int nod)
{
if(depth[nod]>depth_max)depth_max=depth[nod];
vector<int>::iterator it;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
depth[*it]=depth[nod]+1;
dfs(*it);
}
}
void dfs1(int nod)
{
vector<int>::iterator it;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
depth[*it]=depth[nod]+1;
if(depth[*it]%h==0)sqparent[*it]=nod;
else
sqparent[*it]=sqparent[nod];
dfs1(*it);
}
}
int naivelca(int u ,int v)
{
if(depth[u]>depth[v])swap(u,v);
if(depth[u]==depth[v])
{
if(u==v)return u;
u=parent[u];
v=parent[v];
return naivelca(u,v);
}
v=parent[v];
return naivelca(u,v);
}
int sqlca(int u,int v)
{
if(depth[u]>depth[v])swap(u,v);
if(sqparent[u]!=sqparent[v])
{
return sqlca(u,sqparent[v]);
}
return naivelca(u,v);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int m,n,i,j;
scanf("%d%d",&m,&n);
for(i=2;i<=m;i++)
{scanf("%d",&parent[i]);v[parent[i]].push_back(i);}
dfs(1);
parent[1]=0;
depth[0]=-1;
h=(int)sqrt((double)depth_max);
fill(depth,depth+NMAX,0);
dfs1(1);
for(i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int ans=sqlca(x,y);
printf("%d\n",ans);
}
return 0;
}