package Ġrange query Ċ Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ class ĠSegment Tree ( val Ġtree As Array Ġ: ĠArray < Double >, Ġval Ġsize Ġ: ĠInt , Ġval Ġrange Function : ĠRange Function ) Ġ: ĠRange Queryable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġquery ( range Query : ĠRange Query ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range Query . startIndex Ġ< Ġ 0 Ġ|| Ġrange Query . end Index Ġ> Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ range Query Ġis Ġinvalid Ġas Ġits Ġnot Ġwithin Ġbounds Ġ 0 Ġand Ġ${ size Ġ- Ġ 1 }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Query ( 0 , Ġ 0 , Ġsize Ġ- Ġ 1 , Ġrange Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Query ( tree Pos Ġ: ĠInt , Ġnode Start Ġ: ĠInt , Ġnode End Ġ: ĠInt , Ġrange Query : ĠRange Query Ġ) Ġ: ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range Query . startIndex Ġ<= Ġnode Start Ġ&& Ġrange Query . end Index Ġ>= Ġnode End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFull Ġoverlap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtree As Array [ tree Pos ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( node End Ġ< Ġrange Query . startIndex Ġ|| Ġnode Start Ġ> Ġrange Query . end Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġoverlap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrange Function . null Value ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpartial Ġoverlap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Ġ= Ġ( node Start Ġ+ Ġnode End ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Value Ġ= Ġdo Query (( 2 Ġ* Ġtree Pos ) Ġ+ Ġ 1 , Ġnode Start , Ġmiddle , Ġrange Query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Value Ġ= Ġdo Query (( 2 Ġ* Ġtree Pos ) Ġ+ Ġ 2 , Ġmiddle Ġ+ Ġ 1 , Ġnode End , Ġrange Query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrange Function . execute ( left Value , Ġright Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmake Segment Tree ( values Ġ: ĠArray < Double >, Ġrange Function Ġ: ĠRange Function ) Ġ: ĠSegment Tree Ġ{ ĊĠĠĠ Ġ// println ( utils . log 2 ( values . size . toDouble ())) ĊĠĠĠ Ġval Ġtree Height Ġ= ĠMath . ceil ( utils . log 2 ( values . size . toDouble ()) Ġ+ Ġ 1 ). toInt () ĊĠĠĠ Ġ// println ( tree Height ) ĊĠĠĠ Ġval Ġtree Size Ġ= ĠMath . pow ( 2 . 0 , Ġtree Height . toDouble ()). toInt () ĊĠĠĠ Ġ// println ( tree Size ) ĊĠĠĠ Ġval Ġtree Ġ= ĠArray < Double >( tree Size ) Ġ{ Ġrange Function . null Value Ġ} ĊĠĠĠ Ġdo Make Segment Tree ( tree , Ġ 0 , Ġvalues , Ġ 0 , Ġvalues . size Ġ- Ġ 1 , Ġrange Function ) ĊĠĠĠ Ġreturn ĠSegment Tree ( tree , Ġvalues . size , Ġrange Function ) Ċ } Ċ Ċ private Ġfun Ġdo Make Segment Tree ( ĊĠĠĠ Ġtree Ġ: ĠArray < Double >, ĊĠĠĠ Ġt pos Ġ: ĠInt , ĊĠĠĠ Ġvalues Ġ: ĠArray < Double >, ĊĠĠĠ Ġleft Ġ: ĠInt , ĊĠĠĠ Ġright Ġ: ĠInt , ĊĠĠĠ Ġrange Function : ĠRange Function ) Ġ: ĠDouble Ġ{ ĊĊĠĠĠ Ġif Ġ( left Ġ== Ġright ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtree [ tp os ] Ġ= Ġvalues [ left ] ĊĠĠĠĠĠĠĠ Ġreturn Ġtree [ tp os ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmid Ġ= Ġ( left Ġ+ Ġright ) Ġ/ Ġ 2 ĊĠĠĠ Ġval Ġleft Value Ġ= Ġdo Make Segment Tree ( tree , Ġ( 2 Ġ* Ġt pos ) Ġ+ Ġ 1 , Ġvalues , Ġleft , Ġmid , Ġrange Function ) ĊĠĠĠ Ġval Ġright Value Ġ= Ġdo Make Segment Tree ( tree , Ġ( 2 Ġ* Ġt pos ) Ġ+ Ġ 2 , Ġvalues , Ġmid Ġ+ Ġ 1 , Ġright , Ġrange Function ) ĊĠĠĠ Ġtree [ tp os ] Ġ= Ġrange Function . execute ( left Value , Ġright Value ) ĊĠĠĠ Ġreturn Ġtree [ tp os ] Ċ }