Pagini recente » Cod sursa (job #963380) | Cod sursa (job #1675524) | Cod sursa (job #1851198) | Cod sursa (job #776008) | Cod sursa (job #2434376)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int NMAX = 100005;
const int LMAX = 20;
vector <int> v[NMAX];
int n,m,k;
int lvl[NMAX],euler[NMAX],dp[LMAX][NMAX],first[NMAX],lg[NMAX];
void dfs(int nod, int l){
euler[++k] = nod;
first[nod] = k;
lvl[nod] = l;
for(auto it: v[nod])
if(!lvl[it]){
dfs(it, l + 1);
euler[++k] = nod;
}
}
void buildDP(){
int i,j;
for(i = 2 ; i <= k ; i++)
lg[i] = lg[i / 2] + 1;
for(i = 1 ; i <= k ; i++)
dp[0][i] = euler[i];
for(i = 1 ; i <= lg[k] ; i++)
for(j = 1 ; j <= k - (1 << i) ; j++){
dp[i][j] = dp[i - 1][j];
if(lvl[dp[i - 1][j + (1 << (i - 1))]] < lvl[dp[i - 1][j]])
dp[i][j] = dp[i - 1][j + (1 << (i - 1) ) ];
}
}
int query(int x, int y){
x = first[x];
y = first[y];
if(x > y)
swap(x, y);
int dif = y - x + 1, l = lg[dif];
if(lvl[dp[l][x]] < lvl[dp[l][y - (1 << l) + 1]])
return dp[l][x];
return dp[l][y - (1 << l) + 1];
}
int main(){
int i,x,y;
f >> n >> m;
for(i = 2 ; i <= n ; i++){
f >> x;
v[x].push_back(i);
}
lvl[1] = 1;
dfs(1,1);
buildDP();
for(i = 1 ; i <= m ; i++){
f >> x >> y;
g << query(x, y) << "\n";
}
return 0;
}