Pagini recente » Cod sursa (job #1372115) | Cod sursa (job #206867) | Cod sursa (job #1353646) | Cod sursa (job #1293741) | Cod sursa (job #2272674)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N, M, x, y, val, _log[200003], D[21][200003];
vector<int> G[100003];
vector<int> euler, lv;
map<int, int> apar;
void df_euler(int nod, int nivel)
{
if(!apar.count(nod))
{
euler.push_back(nod);
lv.push_back(nivel);
apar[nod] = euler.size() - 1;
for(auto val: G[nod])
{
df_euler(val, nivel + 1);
euler.push_back(nod);
lv.push_back(nivel);
}
}
}
int main()
{
f >> N >> M;
for(int i = 2; i <= N; i++)
{
f >> x;
G[x].push_back(i);
}
euler.push_back(0);
lv.push_back(0);
df_euler(1, 1);
_log[0] = -1;
int n = euler.size() - 1;
for(int i = 1; i <= n; i++)
_log[i] = _log[i / 2] + 1, D[0][i] = i;
for(int i = 1; i <= _log[n]; i++)
{
for(int j = 1; j <= n - (1 << i) + 1; j++)
{
if(lv[D[i - 1][j]] < lv[D[i - 1][j + (1 << i - 1)]])
D[i][j] = D[i - 1][j];
else
D[i][j] = D[i - 1][j + (1 << i - 1)];
}
}
for(int i = 1; i <= M; i++)
{
f >> x >> y;
int x1 = apar[x], x2 = apar[y];
if(x1 == x2)
g << euler[x1] << "\n";
else {
if(x1 > x2) swap(x1, x2);
int k = _log[x2 - x1];
if(lv[D[k][x1]] < lv[D[k][x2 - (1 << k) + 1]])
g << euler[D[k][x1]] << "\n";
else
g << euler[D[k][x2 - (1 << k) + 1]] << "\n";
}
}
return 0;
}