Pagini recente » Cod sursa (job #499894) | Cod sursa (job #3349112) | Cod sursa (job #1872244) | Cod sursa (job #2565618) | Cod sursa (job #3322933)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
struct pseudopair
{
int euler, level;
};
vector<pseudopair> v;
int n, m, i, x, y, j, contor, rmq[20][200010], first[100010];
bool viz[100010];
vector<vector<int>> mat;
void dfs(int x, int depth)
{
if (first[x] == 0)
first[x] = contor;
rmq[0][contor] = contor;
v.push_back({x, depth});
++contor;
viz[x] = 1;
for (auto ind : mat[x])
if (viz[ind] == 0)
{
dfs(ind, depth+1);
rmq[0][contor] = contor;
v.push_back({x, depth});
++contor;
}
}
int main()
{
in >> n >> m;
mat.resize(n+2);
for (i = 2; i <= n; i++)
{
in >> x;
mat[i].push_back(x);
mat[x].push_back(i);
}
dfs(1, 0);
for (i = 1; (1<<i) <= contor; i++)
{
for (j = 0; j < contor - (1<<i) +1; j++)
{
rmq[i][j] = rmq[i-1][j];
if (v[rmq[i][j]].level > v[rmq[i-1][j+(1<<(i-1))]].level)
rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
//out << rmq[i][j] << ' ';
}
//out << '\n';
}
while(m)
{
--m;
in >> x >> y;
if (first[x] > first[y])
swap(x, y);
int dist = first[y] - first[x] + 1;
int l2 = log2(dist);
if (v[rmq[l2][first[x]]].level > v[rmq[l2][first[y]-(1<<l2)+1]].level)
out << v[rmq[l2][first[y]-(1<<l2)+1]].euler;
else
out << v[rmq[l2][first[x]]].euler;
out << '\n';
}
return 0;
}