Pagini recente » Cod sursa (job #2376393) | Cod sursa (job #188135) | Cod sursa (job #2324942)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, h[100005], dp[50][1000000];
vector <int> v[100005], E, L;
bool viz[100005];
void DFS(int nod, int level)
{
E.push_back(nod);
viz[nod] = 1;
L.push_back(level);
if(!h[nod])
h[nod] = E.size()-1;
for(int i = 0; i < v[nod].size(); i++)
{
if(!viz[v[nod][i]])
{
DFS(v[nod][i], level+1);
E.push_back(nod);
L.push_back(level);
}
}
}
int main()
{
E.push_back(0);
L.push_back(0);
fin >> n >> m;
for(int i = 1; i < n; i++)
{
int x;
fin >> x;
v[x].push_back(i+1);
v[i+1].push_back(x);
}
DFS(1, 1);
for(int i = 1; i < E.size(); i++)
dp[0][i] = i;
for(int i = 1; (1<<i) < E.size(); i++)
{
for(int j = 1; j+(1<<i) -1 < E.size(); j++)
{
if(L[dp[i-1][j]] < L[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))];
// fout << dp[i][j] << " ";
}
//fout << '\n';
}
while(m--)
{
int a, b;
fin >> a >> b;
if(h[b] < h[a])
swap(a,b);
float k = log(h[b]-h[a]+1)/log(2);
int x = (int) k;
if(L[dp[x][h[a]]] < L[dp[x][h[b]-(1<<x)+1]])
fout << E[dp[x][h[a]]] << '\n';
else
fout << E[dp[x][h[b]-(1<<x)+1]] << '\n';
}
return 0;
}