把樹展開成鏈
然後ST表
void dfs( int u , int ft ){
dep[ u ] = dep[ ft ] + 1 ;
a[ fir[ u ] = ++m ] = u ;//fir[i]->i號點在鏈上第一個位置
for( int i = f[ u ] ; i ; i = nxt[ i ] ){
int v = to[ i ] ;
if( v == ft )continue;
dfs( v , u ) ;
a[ ++m ] = u ;//a[]儲存鏈
}
}
void initRMQ(){
for(int i = 1 ; i <= m ; i++ ) RMQ[ i ][ 0 ] = a[ i ] ;
for(int j = 1 ; j <= 18 ; j++ ) for(int i = 1 ; i <= m - ( 1 << j ) + 1 ; i++ ){
int x = RMQ[ i ][ j - 1 ] , y = RMQ[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ;
RMQ[ i ][ j ] = dep[ x ] < dep[ y ] ? x : y ;
}
}