Pagini recente » Cod sursa (job #1922097) | Cod sursa (job #142809) | Cod sursa (job #1948265) | Cod sursa (job #2391876) | Cod sursa (job #2174677)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Nmax = 100005;
int n, m, x, y, log1, log2;
int nivel[Nmax];
int dp[20][Nmax];
vector <int> A[Nmax];
void DFS (int nod, int niv)
{
nivel[nod] = niv;
for (auto i = 0; i < A[nod].size(); i++)
DFS(A[nod][i], niv + 1);
}
int lca (int x, int y)
{
if (nivel[x] < nivel[y])
swap (x, y);
for (log1 = 1; (1<<log1) < nivel[x]; log1++);
for (log2 = 1; (1<<log2) < nivel[y]; log2++);
for (int i = log1; i >= 0; i--)
if (nivel[x] - (1<<i) >= nivel[y])
x = dp[i][x];
if (x == y)
return x;
for (int i = log2; i >= 0; i--)
if (dp[i][x] != dp[i][y])
{
x = dp[i][x];
y = dp[i][y];
}
return dp[0][y];
}
int main()
{
in >> n >> m;
for (auto i = 2; i <= n; i++)
{
in >> dp[0][i];
A[dp[0][i]].push_back(i);
}
for (int i = 1; (1<<i) <= n; i++)
for (int j = 1; j <= n; j++)
dp[i][j] = dp[i-1][dp[i-1][j]];
DFS(1, 0);
for (int i = 1; i <= m; i++)
{
in >> x >> y;
out << lca (x, y) << '\n';
}
return 0;
}