Pagini recente » Cod sursa (job #1315852) | Cod sursa (job #2224684) | Cod sursa (job #488845) | Cod sursa (job #741550) | Cod sursa (job #2914351)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int LOG = 17;
vector <int> g[200003];
bool viz[200003];
int dp[19][200003], d[200003];
void dfs(int nod)
{
for (int u : g[nod])
if (!viz[u])
{
d[u] = d[nod] + 1;
dfs(u);
}
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, q, i;
cin >> n >> q;
for (i = 2; i <= n; i++)
{
int x;
cin >> x;
dp[0][i] = x;
g[x].push_back(i);
}
dfs(1);
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i <= n; i++)
dp[j][i] = dp[j - 1][dp[j - 1][i]];
while (q--)
{
int a, b;
cin >> a >> b;
if (d[a] < d[b])
swap(a, b);
int k = d[a] - d[b];
for (int j = 0; (1 << j) <= k; j++)
if (k & (1 << j))
a = dp[j][a];
if (a == b)
{
cout << a << "\n";
continue;
}
for (int j = LOG; j >= 0; j--)
if (dp[j][a] != dp[j][b])
{
a = dp[j][a];
b = dp[j][b];
}
cout << dp[0][a] << "\n";
}
}