Pagini recente » Cod sursa (job #1493343) | Cod sursa (job #506651) | Cod sursa (job #2744416) | Cod sursa (job #2152232) | Cod sursa (job #2355557)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m;
vector <int> g[100005];
int adancime[100005], ap[100005];
vector <int> dp[20];
void dfs(int nod, int ad)
{
adancime[nod] = ad;
ap[nod]=dp[0].size();
dp[0].push_back(nod);
for(int i : g[nod])
{
dfs(i,ad+1);
dp[0].push_back(nod);
}
}
int main()
{
in >> n >> m;
for(int i=2; i<=n; ++i)
{
int x;
in >> x;
g[x].push_back(i);
}
dfs(1,0);
int len = dp[0].size();
for(int i = 1; (1<<i) <= len; ++i)
{
for(int j = 0; j+(1<<(i-1)) < len; ++j)
if(adancime[dp[i-1][j]] < adancime[dp[i-1][j+(1<<(i-1))]])
dp[i].push_back(dp[i-1][j]);
else
dp[i].push_back(dp[i-1][j+(1<<(i-1))]);
}
for(int i = 0; i < m; ++i)
{
int x, y;
in >> x >> y;
x=ap[x];
y=ap[y];
if(x>y)
swap(x,y);
int k = log2(y-x+1);
if(adancime[dp[k][x]] < adancime[dp[k][y-(1<<(k))+1]])
out<<dp[k][x];
else
out<<dp[k][y-(1<<(k))+1];
out<<"\n";
}
return 0;
}