Pagini recente » Cod sursa (job #2324595) | Cod sursa (job #2789128) | Cod sursa (job #277893) | Cod sursa (job #843823) | Cod sursa (job #2576497)
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, k, st, dr, mi, deep[N], start[N], e[18][2 * N];
vector <int> v[N];
void dfs(int, int);
int main()
{
f >> n >> m;
for(int i = 2; i <= n; i++)
{
int x;
f >> x;
v[x].push_back(i);
}
dfs(1, 1);
for(int i = 1, p = 1, P = 2; P <= k; p *= 2, P *= 2, i++)
for(st = 1, mi = p + 1, dr = P; dr <= k; dr++, st++, mi++)
e[i][st] = deep[e[i - 1][st]] < deep[e[i - 1][mi]]?e[i - 1][st]:e[i - 1][mi];
for(; m; m--)
{
int x, y;
f >> x >> y;
x = start[x];
y = start[y];
if(x > y)
swap(x, y);
int i = 31 - __builtin_clz(y - x + 1);
int p = 1 << i;
y = y - p + 1;
x = e[i][x];
y = e[i][y];
x = deep[x] < deep[y] ? x:y;
g << x << '\n';
}
return 0;
}
void dfs(int nod, int niv)
{
e[0][++k] = nod;
start[nod] = k;
deep[nod] = niv;
for(auto it:v[nod])
{
dfs(it, niv + 1);
e[0][++k] = nod;
}
}