Pagini recente » Cod sursa (job #2718558) | Cod sursa (job #2885076) | Cod sursa (job #2947952) | Cod sursa (job #2747036) | Cod sursa (job #2846586)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 2;
int n, m;
int t[20][NMAX];
int lvl[NMAX];
vector <int> G[NMAX];
void Lift(int x, int &y)
{
int delta = lvl[y] - lvl[x];
for(int p = 0; (1 << p) <= delta; ++p)
if(delta & (1 << p))
y = t[p][y];
return;
}
int LCA (int x, int y)
{
if(lvl[x] < lvl[y])
Lift(x, y);
else Lift(y, x);
if(x == y)
return x;
for(int p = 19; p >= 0; --p) {
if(t[p][x] == t[p][y])
continue;
else x = t[p][x], y = t[p][y];
}
return t[0][x];
}
void dfs(int node, int level)
{
lvl[node] = level;
for(auto it: G[node])
dfs(it, level + 1);
return;
}
int main()
{
fin >> n >> m;
for(int i = 2; i <= n; ++i) {
fin >> t[0][i];
G[t[0][i]].push_back(i);
}
dfs(1, 1);
for(int i = 1; i <= 19; ++i)
for(int j = 1; j <= n; ++j)
t[i][j] = t[i - 1][t[i - 1][j]];
int a, b;
for(int i = 1; i <= m; ++i)
fin >> a >> b, fout << LCA(a, b) << '\n';
return 0;
}