Pagini recente » Cod sursa (job #2948741) | Cod sursa (job #630637) | Cod sursa (job #3041212) | Cod sursa (job #1548124) | Cod sursa (job #2989155)
#include <bits/stdc++.h>
//#define int long long
/// lca cu binary jumping
using namespace std;
int n;
const int N = 1e5 + 5;
int father[N];
vector <int> g[N];
int up[21][N];
int q;
int L[N];
void dfs(int nod, int level, int p)
{
L[nod] = level;
for(int v:g[nod])
{
if(v != p)
dfs(v, level + 1, nod);
}
}
int lca(int p, int q)
{
if(L[p] < L[q])
swap(p, q);
int diff = L[p] - L[q];
for(int i = 20; i >= 0; i--)
if(diff & (1 << i)) p = up[i][p];
if(p == q) return p;
for(int i = 20; i >= 0; i--)
{
if(up[i][p] != up[i][q])
{
p = up[i][p];
q = up[i][q];
}
}
return up[0][p];
}
signed main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int m;
cin >> n >> m;
for (int i = 2; i <= n; ++i)
{
cin >> father[i];
g[father[i]].push_back(i);
up[0][i] = father[i];
}
up[0][1] = 0;
dfs(1, 0, -1);
for(int i = 1; 1 << i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
up[i][j] = up[i - 1][ up[i - 1][j] ];
}
}
for(int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
cout << lca(x, y) << '\n';
}
return 0;
}