Pagini recente » Cod sursa (job #1880116) | Cod sursa (job #1719960) | Cod sursa (job #1667247) | Cod sursa (job #3303458) | Cod sursa (job #3329691)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, i, grad[100005], first[100005], rmq[18][200005], sz, lg[200005], mx, p, x, y, a, b;
vector<int>v[100005], euler;
void dfs (int nod, int tata)
{
euler.push_back (nod);
first[nod] = euler.size() - 1;
for (auto x : v[nod])
{
if (x == tata) continue;
grad[x] = grad[nod] + 1;
dfs (x, nod);
euler.push_back (nod);
}
}
int main()
{
fin >> n >> m;
euler.push_back (0);
for (i = 2; i <= 2 * n; i++) lg[i] = lg[i / 2] + 1;
for (i = 2; i <= n; i++)
{
fin >> x;
v[i].push_back (x);
v[x].push_back (i);
}
grad[1] = 1;
dfs (1, 0);
sz = euler.size() - 1;
mx = lg[sz];
for (i = 1; i <= sz; i++) rmq[0][i] = euler[i];
for (p = 1; p <= mx; p++)
for (i = 1; i <= sz - (1 << p) + 1; i++)
{
if (grad[rmq[p - 1][i]] < grad[rmq[p - 1][i + (1 << (p - 1))]]) rmq[p][i] = rmq[p - 1][i];
else rmq[p][i] = rmq[p - 1][i + (1 << (p - 1))];
}
for (i = 1; i <= m; i++)
{
fin >> x >> y;
x = first[x];
y = first[y];
if (y < x) swap (x, y);
p = lg[y - x + 1];
a = rmq[p][x];
b = rmq[p][y - (1 << p) + 1];
if (grad[a] > grad[b]) fout << b;
else fout << a;
fout << '\n';
}
return 0;
}