Pagini recente » Cod sursa (job #3162089) | Cod sursa (job #680317) | Cod sursa (job #594111) | Cod sursa (job #2867350) | Cod sursa (job #2527208)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
const int MAXN = 100000 + 5;
const int MAXLOG = log2(MAXN);
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,intrebari;
int dp[MAXN][MAXLOG + 5],inaltime[MAXN];
vector<int>graf[MAXN];
void dfs(int nod){
for(int i = 0; i < graf[nod].size(); i++){
int curent = graf[nod][i];
inaltime[curent] = inaltime[nod] + 1;
dfs(curent);
}
}
void urca_nod(int &nod,int nod_de_ajuns){
int put = MAXLOG;
while(inaltime[nod] != inaltime[nod_de_ajuns]){
if(inaltime[dp[nod][put]] >= inaltime[nod_de_ajuns])
nod = dp[nod][put];
put--;
}
}
int main()
{
in>>n>>intrebari;
inaltime[1] = 1;
for(int i = 2; i <= n; i++){
int nod;
in>>nod;
dp[i][0] = nod;
graf[nod].push_back(i);
}
dfs(1);
for(int put = 1; put < MAXLOG; put++){
for(int i = 2; i <= n; i++){
dp[i][put] = dp[dp[i][put - 1]][put - 1];
}
}
for(int i = 1; i <= intrebari; i++){
int nod1,nod2;
in>>nod1>>nod2;
int put = MAXLOG,stramos;
/// eu vreau ca nod1 sa fie mai jos in graf decat nod2 adica ca inaltime[nod1] > inaltime[nod2]
if(inaltime[nod1] < inaltime[nod2])
swap(nod1,nod2);/// daca nu este asa cum vreau eu, schimb nod1 si nod2
///while(inaltime[nod1] != inaltime[nod2])
///nod1 = dp[nod1][0];
urca_nod(nod1,nod2);
while(put >= 0){
if(dp[nod1][put] && dp[nod2][put] && dp[nod1][put] != dp[nod2][put]){
nod1 = dp[nod1][put];
nod2 = dp[nod2][put];
}
put--;
}
if(nod1 != nod2)
out<<dp[nod1][0];
else
out<<nod1;
out<<"\n";;
}
return 0;
}