Pagini recente » Cod sursa (job #1605076) | Cod sursa (job #2535874) | Profil adrian69 | Cod sursa (job #1749924) | Cod sursa (job #1702141)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int Nmax = 100002;
int n, m, nr;
int log2[2*Nmax], E[2*Nmax], niv[2*Nmax], pos[Nmax], r[2*Nmax][20];
vector<vector<int>> g;
void Dfs(int x, int nv);
void Rmq();
int Lca(int x, int y);
int main() {
fin >> n >> m;
g = vector<vector<int>>(n+1);
int x, y;
for (int i = 2; i <= n; i++)
{
fin >> x;
g[x].push_back(i);
}
for(int i = 2; i < 2 * Nmax; i++)
log2[i] = log2[i / 2] + 1;
Dfs(1, 1);
Rmq();
for(int i = 1; i <= m; i++)
{
fin >> x >> y;
fout << Lca(x, y) << "\n";
}
fin.close();
fout.close();
return 0;
}
void Dfs(int x, int nv)
{
++nr;
E[nr] = x, niv[nr] = nv, pos[x] = nr;
for (auto y : g[x])
{
Dfs(y, nv + 1);
++nr;
E[nr] = x, niv[nr] = nv;
}
}
void Rmq()
{
int N = 2 * n - 1;
for (int i = 1; i <= N; i++)
r[i][0] = i;
for(int j = 1; (1 << j) <= N; j++)
for(int i = 1; i + (1 << j) - 1 <= N; i++)
{
if ( niv[r[i][j - 1]] < niv[r[i + (1 << (j - 1))][j - 1]] )
r[i][j] = r[i][j - 1];
else
r[i][j] = r[i + (1 << (j - 1))][j - 1];
}
}
int Lca(int x, int y)
{
int px = pos[x], py = pos[y];
if ( px > py )
swap(px, py);
int k = log2[py - px + 1];
if ( niv[r[px][k]] < niv[r[py - (1 << k) + 1][k]])
return E[r[px][k]];
return E[r[py - (1 << k) + 1][k]];
}