Pagini recente » Cod sursa (job #2617355) | Cod sursa (job #171032) | Cod sursa (job #554976) | Cod sursa (job #2213503) | Cod sursa (job #2214764)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int tati[100010], nivel[100010], care_lant[100010], boss_lant[100010];
vector < vector<int>> copii;
vector < vector<int>> lant;
int k;
int dfs_ul_ala_blanao(int nod, int nivel_actual)
{
nivel[nod] = nivel_actual;
int ok = 0;
for(int i = 0; i < copii[nod].size(); i++)
{
dfs_ul_ala_blanao(copii[nod][i], nivel_actual+1);
ok = 1;
}
if(ok == 0)
{
lant[k].push_back(nod);
care_lant[nod] = k;
k++;
}
else
{
int maxim = 0, care;
for(int i = 0; i < copii[nod].size(); i++)
{
if(lant[care_lant[copii[nod][i]]].size() > maxim)
{
maxim = lant[care_lant[copii[nod][i]]].size();
care = care_lant[copii[nod][i]];
}
}
lant[care].push_back(nod);
care_lant[nod] = care;
for(int i = 0; i < copii[nod].size(); i++)
{
if(care_lant[copii[nod][i]] != care)
{
boss_lant[care_lant[copii[nod][i]]] = nod;
}
}
}
return 0;
}
int parcurgere(int x, int y)
{
if(care_lant[x] != care_lant[y])
{
if(nivel[boss_lant[care_lant[x]]] > nivel[boss_lant[care_lant[y]]])
{
if(boss_lant[care_lant[x]] == 0)
parcurgere(x, boss_lant[care_lant[y]]);
else
parcurgere(boss_lant[care_lant[x]], y);
}
else
{
if(boss_lant[care_lant[y]] == 0)
parcurgere(boss_lant[care_lant[x]], y);
else
parcurgere(x, boss_lant[care_lant[y]]);
}
}
else
{
if(nivel[x] > nivel[y])
return y;
return x;
}
}
int main()
{
int n, m, x, y;
f >> n >> m;
copii.resize(n + 2);
lant.resize(n + 2);
for(int i = 2; i <= n; i++)
{
f >> x;
copii[x].push_back(i);
tati[i] = x;
}
dfs_ul_ala_blanao(1, 0);
for(int i = 0; i < m; i++)
{
f >> x >> y;
g << parcurgere(x, y) << '\n';
}
return 0;
}