Pagini recente » Cod sursa (job #2253668) | Cod sursa (job #2811532) | Cod sursa (job #1894464) | Cod sursa (job #698249) | Cod sursa (job #2956664)
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>
#include <algorithm>
#include <cmath>
#define N 100000
using namespace std;
int n, q, k, a[2 * N + 5], M[2 * N + 5][25];
int t[N + 5], niv[N + 5], f[N + 5];
bool viz[N + 5];
vector <int> g[N + 5];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int x, int nivel)
{
viz[x] = 1;
a[++k] = x;
niv[k] = nivel;
for (int i = 0; i < g[x].size(); i++)
if (!viz[g[x][i]])
{
dfs(g[x][i], nivel + 1);
a[++k] = x;
niv[k] = nivel;
}
}
void rmq()
{
for (int i = 1; i <= k; i++)
M[i][0] = i;
int log2_k = log2(k);
for (int j = 1; j <= log2_k; j++)
for (int i = 1; i + (1 << j) <= k && i <= k; i++)
{
if (niv[M[i][j - 1]] < niv[M[i + (1 << (j - 1))][j - 1]])
M[i][j] = M[i][j - 1];
else
M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
}
void rezolvare()
{
fin >> n >> q;
for (int i = 2; i <= n; i++)
{
fin >> t[i];
g[t[i]].push_back(i);
g[i].push_back(t[i]);
}
dfs(1, 1);
for (int i = 1; i <= k; i++)
if (!f[a[i]])
f[a[i]] = i;
rmq();
int x, y;
for (int i = 1; i <= q; i++)
{
fin >> x >> y;
int aux1 = min(f[y], f[x]);
int aux2 = max(f[y], f[x]);
int dif = aux2 - aux1 + 1;
int log2_dif = log2(dif);
fout << min(a[M[aux1][log2_dif]], a[M[aux2 - (1 << log2_dif) + 1][log2_dif]]) << '\n';
}
}
int main()
{
rezolvare();
return 0;
}