Pagini recente » Cod sursa (job #697716) | Cod sursa (job #1698418) | Cod sursa (job #3282429) | Cod sursa (job #1497320) | Cod sursa (job #3265469)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int dp[100005][20], dad[100005], depth[100005];
vector <int> son[100005];
void dfs(int x){
int i;
for( i = 0; i < son[x].size(); i++ ){
depth[son[x][i]] = depth[x] + 1;
dfs( son[x][i] );
}
}
int lca(int x, int y){
int i;
if( depth[x] < depth[y] ){
swap( x, y );
}
for( i = 19; i >= 0; i-- ){
if( depth[x] - ( 1 << i ) >= depth[y] ){
x = dp[x][i];
}
}
//cout << x << ' ' << y << ' ' << depth[x] << ' ' << depth[y] << '\n';
if( x == y ){
return x;
}
for( i = 19; i >= 0; i-- ){
if( dp[x][i] != dp[y][i] ){
x = dp[x][i];
y = dp[y][i];
}
}
return dp[x][0];
}
int main(){
int n, q, i, j, x, y;
ifstream fin( "lca.in" );
ofstream fout( "lca.out" );
fin >> n >> q;
for( i = 2; i <= n; i++ ){
fin >> dad[i];
dp[i][0] = dad[i];
son[dad[i]].push_back( i );
}
for( i = 1; i <= n; i++ ){
for( j = 1; j < 20; j++ ){
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
}
dfs( 1 );
for( i = 0; i < q; i++ ){
fin >> x >> y;
fout << lca( x, y ) << '\n';
}
return 0;
}