Pagini recente » Cod sursa (job #2722755) | Cod sursa (job #2649820) | Cod sursa (job #1374132) | Cod sursa (job #334461) | Cod sursa (job #1817197)
#include <bits/stdc++.h>
#define MaxN 100005
#define LgMax 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int>G[MaxN];
int rmq[LgMax][MaxN<<1],nivel[MaxN<<1],first_pos[MaxN<<1],Euler[MaxN<<1],lg2[MaxN<<1],x,y,k,n,m;
void dfs(int nod,int niv)
{
Euler[++k]=nod;
nivel[k]=niv;
first_pos[nod]=k;
for(int i=0;i<G[nod].size();++i)
{
dfs(G[nod][i],niv+1);
Euler[++k]=nod;
nivel[k]=niv;
}
}
void RangeMinimumQuery()
{
for(int i=1;i<=k;++i)
rmq[0][i]=i;
for(int i = 1; (1 << i) < k; ++i)
for(int j = 1; j <= k - (1 << i); ++j)
if(nivel[rmq[i-1][j]]<nivel[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
int LCA(int x,int y)
{
int a=first_pos[x],b=first_pos[y];
lg2[1]=0;
for(int i=2;i<=k;++i)
lg2[i]=lg2[i>>1]+1;
if(a>b)
swap(a,b);
int k=lg2[b-a+1];
int poz;
if(nivel[rmq[k][a]]<nivel[rmq[k][b-(1<<k)+1]])
poz=rmq[k][a];
else
poz=rmq[k][b-(1<<k)+1];
return Euler[poz];
}
int main()
{
fin>>n>>m;
for(int w,i=2;i<=n;++i)
{
fin>>w;
G[w].push_back(i);
}
dfs(1,0);
RangeMinimumQuery();
for(int x,y;m;--m)
{
fin>>x>>y;
fout<<LCA(x,y)<<"\n";
}
}