Pagini recente » Cod sursa (job #2620323) | Cod sursa (job #3273160) | Cod sursa (job #3179304) | Cod sursa (job #3005085) | Cod sursa (job #3264307)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, u, w, viz[100001], p[100001], dp[20][100001], p1, p2;
vector<int>g[100001];
vector<int>e[2];
void dfs(int k, int lvl)
{
viz[k]=1;
e[0].push_back(k);
p[k] = e[0].size() - 1;
e[1].push_back(lvl);
for(int i=0; i<g[k].size(); i++)
{
if(viz[g[k][i]]==0)
{
dfs(g[k][i], lvl+1);
e[0].push_back(k);
e[1].push_back(lvl);
}
}
}
void rmq()
{
for(int i=0; i< e[0].size(); i++)
dp[0][i] = i;
for(int i=1; (1 << i) < e[0].size(); i++)
{
for(int j=0; j <= e[0].size() - (1 << i); j++)
{
if( e[1][dp[i-1][j]] < e[1][dp[i-1][j+ (1 << (i-1) )]] )
dp[i][j] = dp[i-1][j];
else
dp[i][j] = dp[i-1][j+ (1 << (i-1) )];
}
}
}
int main()
{
fin >> n >> m;
for(int i=1; i<n; i++)
{
fin >> u ;
g[i+1].push_back(u);
g[u].push_back(i+1);
}
dfs(1, 0);
rmq();
for(w=1; w<=m; w++)
{
fin >> p1 >> p2;
p1=p[p1];
p2=p[p2];
if(p1 > p2)
swap(p1, p2);
int L=log2(p2-p1+1);
if(e[1][dp[L][p1]] < e[1][dp[L][p2-(1 << L) + 1]])
fout << e[0][dp[L][p1]] << endl;
else
fout << e[0][dp[L][p2-(1 << L) + 1]] << endl;
}
return 0;
}