Pagini recente » Cod sursa (job #2612136) | Cod sursa (job #58369) | Cod sursa (job #2086308) | Cod sursa (job #315146) | Cod sursa (job #2911893)
#include <fstream>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m;
int nivel[100009], p_aparitie[100009];
int dp[200009][25];
vector <int> graf[100009], eul;
int logaritm;
void form_euler(int nod)
{
for(int i=0;i<graf[nod].size();i++)
{
eul.push_back(nod);
int vecin = graf[nod][i];
nivel[vecin] = nivel[nod]+1;
form_euler(vecin);
eul.push_back(vecin);
}
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
int x;
fin>>x;
graf[x].push_back(i);
}
nivel[1] = 0;
form_euler(1);
eul.push_back(1);
logaritm = log2(eul.size());
for(int i=0;i<eul.size();i++)
{
if(p_aparitie[eul[i]]==0)
{
p_aparitie[eul[i]]=i;
}
}
for(int i=0;i<eul.size();i++)
{
dp[0][i] = eul[i];
}
for(int i=1;i<=logaritm;i++)
{
for(int j=0;j<eul.size();j++)
{
if(nivel[dp[i-1][j]]<nivel[dp[i-1][j+(1<<(i-1))]])
{
dp[i][j] = dp[i-1][j];
}
else
{
dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
}
}
for(int intrebare=1;intrebare<=m;intrebare++)
{
int a, b;
fin>>a>>b;
int x = p_aparitie[a];
int y = p_aparitie[b];
if(x>y)
{
int aux=x;
x=y;
y=aux;
}
int putere = log2(y-x+1);
int val_putere = (1<<putere);
if(nivel[dp[putere][x]]<nivel[dp[putere][y-val_putere+1]])
{
fout<<dp[putere][x]<<'\n';
}
else
{
fout<<dp[putere][y-val_putere+1]<<'\n';
}
}
return 0;
}
//1 2 4 7 4 8 4 2 5 2 6 9 6 2 1 3 10 3 11 3 1