Pagini recente » Cod sursa (job #15735) | Cod sursa (job #1581053) | Cod sursa (job #49038) | Cod sursa (job #3212350) | Cod sursa (job #2214912)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector < vector<int>> v, lant;
int tati[100010], nivel[100010], boss[100010], k, care[100010], dp[30][200010];
int DFS(int nod, int nivel_actual)
{
nivel[nod] = nivel_actual;
int ok = 0;
for(int i = 0 ; i < v[nod].size(); i++)
{
ok = 1;
DFS(v[nod][i], nivel_actual + 1);
}
if(ok == 0)
{
lant[k].push_back(nod);
care[nod] = k;
k++;
}
else
{
int pe_care, maxim = 0;
for(int i = 0; i < v[nod].size(); i++)
{
if(lant[care[v[nod][i]]].size() > maxim)
{
maxim = lant[care[v[nod][i]]].size();
pe_care = care[v[nod][i]];
}
}
lant[pe_care].push_back(nod);
care[nod] = pe_care;
for(int i = 0; i < v[nod].size(); i++)
{
if(care[v[nod][i]] != pe_care)
boss[care[v[nod][i]]] = nod;
}
}
return 0;
}
int creez_dinamica(int n)
{
for(int j = 1 ; j < 15; j++)
for(int i = 1; i <= n; i++)
dp[j][i] = dp[j - 1][dp[j - 1][i]];
}
int query(int x, int y)
{
if(care[x] == care[y])
{
if(nivel[x] > nivel[y])
return y;
else
return x;
}
else
{
for(int bit = 15; bit >= 0; bit--)
{
if(bit != 0)
{
if(care[dp[bit][x]] == care[dp[bit][y]] && care[dp[bit - 1][x]] != care[dp[bit - 1][y]])
return query(dp[bit - 1][x], dp[bit - 1][y]);
}
else
{
if(dp[bit][y] == dp[bit][x])
return dp[bit][y];
}
}
}
}
int main()
{
int n, m;
f >> n >> m;
v.resize(n + 2);
lant.resize(n + 2);
for(int i = 2; i <= n; i++)
{
int x;
f >> x;
tati[i] = x;
v[x].push_back(i);
dp[0][i] = x;
}
DFS(1, 0);
creez_dinamica(n);
for(int i = 0 ; i < m ;i++)
{
int x, y;
f >> x >> y;
g << query(x, y) << '\n';
}
}