Pagini recente » Cod sursa (job #33538) | Cod sursa (job #2810676) | Cod sursa (job #648850) | Cod sursa (job #2112376) | Cod sursa (job #2485698)
#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;
vector<int>arbore[MAXN];
int dp[MAXN][MAXLOG + 5],inaltime[MAXN];
int main()
{
in>>n>>intrebari;
inaltime[1] = 1;
for(int i = 2; i <= n; i++){
int nod;
in>>nod;
inaltime[i] = inaltime[nod] + 1;
dp[i][0] = nod;
}
for(int put = 1; put < MAXLOG; put++){
for(int i = 2; i <= n; i++){
int stramos = dp[i][put - 1];
if(stramos)
dp[i][put] = dp[stramos][put - 1];
}
}
/*for(int i = 1; i <= n; i++){
for(int j = 0; j < MAXLOG; j++){
if(dp[i][j])
cout<<"Al "<<(1<<j)<<" lea stramos al lui "<<i<<" este :"<<dp[i][j]<<endl;
}
}*/
for(int i = 1; i <= intrebari; i++){
int nod1,nod2;
in>>nod1>>nod2;
int put = MAXLOG,stramos;
if(inaltime[nod1] < inaltime[nod2])
swap(nod1,nod2);
while(inaltime[nod1] != inaltime[nod2])
nod1 = dp[nod1][0];
//cout<<nod1<<" "<<nod2<<endl;
while(put >= 0){
//cout<<dp[nod1][put]<<" "<<dp[nod2][put]<<":"<<put<<endl;
if(dp[nod1][put] && dp[nod1][put] != dp[nod2][put]){
nod1 = dp[nod1][put];
nod2 = dp[nod2][put];
}
if(put == 0)
break;
put /= 2;
}
if(nod1 != nod2)
out<<dp[nod1][0];
else
out<<nod1;
out<<"\n";
//cout<<stramos<<"\n";
}
return 0;
}