Pagini recente » Cod sursa (job #3344945) | Cod sursa (job #3337385) | Cod sursa (job #3328282) | Cod sursa (job #3328280) | Cod sursa (job #3354763)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> p;
vector<vector<int>> v;
vector<int> depth;
int LOG;
void dfs(int nod){
for(int i = 1;i<=LOG;i++){
p[nod][i] = p[p[nod][i-1]][i-1];
if(p[nod][i] == 0)
break;
}
for(int i = 0 ; i < v[nod].size();i++){
int newnod = v[nod][i];
if(newnod != p[nod][0]){
depth[newnod] = depth[nod] + 1;
dfs(newnod);
}
}
}
int lca(int a,int b){
if(depth[a] > depth[b])
swap(a,b);
int dif = depth[b] - depth[a];
for(int i = 0;i<=LOG;i++){
if(dif & (1<<i))
b = p[b][i];
}
if(a == b)
return a;
for(int i=LOG;i>=0;i--){
if(p[a][i] != p[b][i]){
a = p[a][i];
b = p[b][i];
}
}
return p[a][0];
}
int main()
{
int n,q;
fin>>n>>q;
int copien = n;
while(copien){
LOG++;
copien/=2;
}
p.resize(n+1,vector<int>(LOG+1,0));
v.resize(n+1);
depth.resize(n+1);
depth[1] = depth[0] = 0;
for(int i=2;i<=n;i++){
int x;
fin>>x;
p[i][0] = x;
v[i].push_back(x);
v[x].push_back(i);
}
dfs(1);
for(int i=1;i<=q;i++){
int a,b;
fin>>a>>b;
fout<<lca(a,b)<<"\n";
}
}