Pagini recente » Cod sursa (job #3124412) | Cod sursa (job #1916998) | Cod sursa (job #3248760) | Cod sursa (job #602668) | Cod sursa (job #2787100)
#include <fstream>
#include <vector>
#define MAX_N 100005
#define MAX_L 20
#define foreach(V) for(auto it = (V).begin(); it != (V).end(); ++it)
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N, M, T[MAX_L][MAX_N], Lg[MAX_N], Lev[MAX_N];
vector <int> G[MAX_N];
void citire()
{
fin >> N >> M;
for (int i = 2; i <= N; ++i)
{
fin >> T[0][i];
G[T[0][i]].push_back(i);
}
int k;
for (k = 1; (1 << k) <= N; ++k)
for (int i = 1; i <= N; ++i)
T[k][i] = T[k - 1][T[k - 1][i]];
}
void dfs(int nod, int lev)
{
Lev[nod] = lev;
foreach(G[nod])
dfs(*it, lev + 1);
}
int lca(int x, int y)
{
if (Lev[x] < Lev[y])
swap(x, y);
int log1, log2;
for (log1 = 1; (1 << log1) < Lev[x]; ++log1);
for (log2 = 1; (1 << log2) < Lev[y]; ++log2);
for (int k = log1; k >= 0; --k)
if (Lev[x] - (1 << k) >= Lev[y])
x = T[k][x];
if (x == y) return x;
for (int k = log2; k >= 0; --k)
if (T[k][x] && T[k][x] != T[k][y])
x = T[k][x],
y = T[k][y];
return T[0][x];
}
int main()
{
citire();
dfs(1, 0);
while (M--)
{
int x, y;
fin >> x >> y;
fout << lca(x, y) << "\n";
}
}