Pagini recente » Cod sursa (job #2890391) | Cod sursa (job #414648) | Cod sursa (job #1190598) | Cod sursa (job #803819) | Cod sursa (job #2566055)
#include <bits/stdc++.h>
#define NMAX 100009
#define LOGMAX 24
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int k, int lvl);
void prel();
int level[2*NMAX];
int rmq[2*NMAX];int lg;
int first[NMAX];
int sol[2*NMAX][LOGMAX];
vector<int>g[NMAX];
int n,m;
int i,j;
int tata;
int main()
{fin>>n>>m;
for(i=2;i<=n;i++){fin>>tata;
g[tata].push_back(i);
}
dfs(1,1);
prel();
for(i=1;i<=m;i++)
{int st,dr;
fin>>st>>dr;
st=first[st];
dr=first[dr];
if(st>dr)swap(st,dr);
int lg=log2(dr-st+1);
if(level[ sol[st][lg]]<level[ sol[dr- (1<<lg)+1][lg]])
fout<<rmq[ sol[st][lg]]<<'\n';
else
fout<<rmq[ sol[dr- (1<<lg)+1][lg] ]<<'\n';
}
return 0;
}
void dfs(int k, int lvl)
{int i;
rmq[++lg]=k;
level[lg]=lvl;
first[k]=lg;
for(i=0;i<g[k].size() ;i++)
{
dfs(g[k][i],lvl+1);
rmq[++lg]=k;
level[lg]=lvl;
}
}
void prel()
{
int i,j;
for(i=1;i<=2*n-1;i++)
sol[i][0]=i;
for(j=1;(1<<j)<=2*n-1;j++)
for(i=1;i<=2*n-1;i++)
if( level[sol[i][j-1]] < level[sol[i+ (1<<(j-1))][j-1]] )
sol[i][j]=sol[i][j-1];
else
sol[i][j]=sol[i+ (1<<(j-1))][j-1];
}