package Ġgraphs . l ca Ċ Ċ import Ġjava . util . stream . Stream Ċ Ċ // ĠAnswer ing ĠL CA Ġqueries Ġin ĠO ( log ( n )) Ġwith ĠO ( n ) Ġpreprocessing Ċ class ĠL ca ( tree : ĠArray < List < Integer >>, Ġroot : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġdepth : ĠInt Array ĊĠĠĠ Ġvar Ġdfs _ order : ĠInt Array ĊĠĠĠ Ġvar Ġcnt : ĠInt ĊĠĠĠ Ġvar Ġfirst : ĠInt Array ĊĠĠĠ Ġvar Ġmin Pos : ĠInt Array ĊĠĠĠ Ġvar Ġn : ĠInt ĊĠĠĠ Ġfun Ġdfs ( tree : ĠArray < List < Integer >>, Ġu : ĠInt , Ġd : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdepth [ u ] Ġ= Ġd ĊĠĠĠĠĠĠĠ Ġdfs _ order [ cnt ++] Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġtree [ u ]) Ġif Ġ( depth [ v ] Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdfs ( tree , Ġv , Ġd Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdfs _ order [ cnt ++] Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Tree ( node : ĠInt , Ġleft : ĠInt , Ġright : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ== Ġright ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Pos [ node ] Ġ= Ġdfs _ order [ left ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġleft Ġ+ Ġright Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġbuild Tree ( 2 Ġ* Ġnode Ġ+ Ġ 1 , Ġleft , Ġmid ) ĊĠĠĠĠĠĠĠ Ġbuild Tree ( 2 Ġ* Ġnode Ġ+ Ġ 2 , Ġmid Ġ+ Ġ 1 , Ġright ) ĊĠĠĠĠĠĠĠ Ġmin Pos [ node ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth [ min Pos [ 2 Ġ* Ġnode Ġ+ Ġ 1 ]] Ġ< Ġdepth [ min Pos [ 2 Ġ* Ġnode Ġ+ Ġ 2 ]]) Ġmin Pos [ 2 Ġ* Ġnode Ġ+ Ġ 1 ] Ġelse Ġmin Pos [ 2 Ġ* Ġnode Ġ+ Ġ 2 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġl ca ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Pos ( Math . min ( first [ a ], Ġfirst [ b ]), ĠMath . max ( first [ a ], Ġfirst [ b ]), Ġ 0 , Ġ 0 , Ġn Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmin Pos ( a : ĠInt , Ġb : ĠInt , Ġnode : ĠInt , Ġleft : ĠInt , Ġright : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġleft Ġ&& Ġright Ġ== Ġb ) Ġreturn Ġmin Pos [ node ] ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġleft Ġ+ Ġright Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( a Ġ<= Ġmid Ġ&& Ġb Ġ> Ġmid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġmin Pos ( a , ĠMath . min ( b , Ġmid ), Ġ 2 Ġ* Ġnode Ġ+ Ġ 1 , Ġleft , Ġmid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġmin Pos ( Math . max ( a , Ġmid Ġ+ Ġ 1 ), Ġb , Ġ 2 Ġ* Ġnode Ġ+ Ġ 2 , Ġmid Ġ+ Ġ 1 , Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth [ p 1 ] Ġ< Ġdepth [ p 2 ]) Ġp 1 Ġelse Ġp 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( a Ġ<= Ġmid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Pos ( a , ĠMath . min ( b , Ġmid ), Ġ 2 Ġ* Ġnode Ġ+ Ġ 1 , Ġleft , Ġmid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( b Ġ> Ġmid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Pos ( Math . max ( a , Ġmid Ġ+ Ġ 1 ), Ġb , Ġ 2 Ġ* Ġnode Ġ+ Ġ 2 , Ġmid Ġ+ Ġ 1 , Ġright ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUsage Ġexample ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String ?> ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree : ĠArray < List < Integer >> Ġ= ĠStream . generate Ġ{ ĠArrayList () Ġ}. limit ( 5 ). toArray Ġ{ Ġ_ Dummy _. __ Array __() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree [ 0 ]. add ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree [ 0 ]. add ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree [ 1 ]. add ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree [ 1 ]. add ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl ca Ġ= ĠL ca ( tree , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( 0 Ġ== Ġl ca . l ca ( 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( 1 Ġ== Ġl ca . l ca ( 3 , Ġ 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( 0 Ġ== Ġl ca . l ca ( 4 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġtree . size ĊĠĠĠĠĠĠĠ Ġdepth Ġ= ĠInt Array ( nodes ) ĊĠĠĠĠĠĠĠ ĠArrays . fill ( depth , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġn Ġ= Ġ 2 Ġ* Ġnodes Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġdfs _ order Ġ= ĠInt Array ( n ) ĊĠĠĠĠĠĠĠ Ġcnt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdfs ( tree , Ġroot , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġmin Pos Ġ= ĠInt Array ( 4 Ġ* Ġn ) ĊĠĠĠĠĠĠĠ Ġbuild Tree ( 0 , Ġ 0 , Ġn Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġfirst Ġ= ĠInt Array ( nodes ) ĊĠĠĠĠĠĠĠ ĠArrays . fill ( first , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdfs _ order . indices ) Ġif Ġ( first [ dfs _ order [ i ]] Ġ== Ġ- 1 ) Ġfirst [ dfs _ order [ i ]] Ġ= Ġi ĊĠĠĠ Ġ} Ċ } Ċ