Pagini recente » Cod sursa (job #3253818) | Cod sursa (job #2656714) | Cod sursa (job #2088090) | Cod sursa (job #2508946) | Cod sursa (job #2565448)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, a, b, t[100002], niv[100003], m, i, st, dr, mid, doi[100002], sol[100003][7], dif;
vector<int> v[100002];
void dfs(int nod, int nivel){
niv[nod] = nivel;
for(int i = 0;i<v[nod].size();i++){
int vecin = v[nod][i];
int put = doi[vecin];
for(int j=1;j<=put;j*=2)
sol[vecin][j] = sol[nod][j]+1;
dfs(vecin, nivel+1);
}
}
/*
int main(){
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>t[i];
v[t[i]].push_back(i);
}
int ant;
doi[1] = ant = 0; /// cea mai mare putere de doi <= i
for(i=2;i<=n;i++){
if((1<<(ant+1)) > i)
doi[i] = ant;
else dfs(1, 1);
doi[i] = ant+1, ant++;
}
dfs(1, 1);
for(i=1;i<=m;i++){
fin>>a>>b;
while(niv[a] > niv[b]){
a = t[a];
}
while(niv[b] > niv[a]){
b = t[b];
}
/// acum, a si b sunt la acelasi nivel
dif = niv[a] - 1;
mid = doi[dif];
st = niv[a];
dr = 1;
while(dr<=st){
if(sol[a][mid] == sol[b][mid]){
st = niv[a]-mid;
dif = niv[a]-dr;
mid = doi[dif];
}
else{
}
a=sol[a][mid], b = sol[b][mid], mid = doi[niv[a]-dr], dif = a-dr, st = niv[a];
}
fout<<dr<<"\n";
}
return 0;
}*/
int main(){
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>t[i];
v[t[i]].push_back(i);
}
dfs(1, 1);
for(i=1;i<=m;i++){
fin>>a>>b;
while(niv[a] > niv[b]){
a = t[a];
}
while(niv[b] > niv[a]){
b = t[b];
}
while(a!=b){
a = t[a];
b = t[b];
}
fout<<a<<"\n";
}
return 0;
}