A utility function for merging two nodes
node MergeUtil ( node l , node r ) { node x ; x . l0 = ( l . l0 != -1 ) ? l . l0 : r . l0 ; x . r0 = ( r . r0 != -1 ) ? r . r0 : l . r0 ; x . l1 = ( l . l1 != -1 ) ? l . l1 : r . l1 ; x . r1 = ( r . r1 != -1 ) ? r . r1 : l . r1 ; x . min0 = min ( l . min0 , r . min0 ) ; if ( l . r0 != -1 && r . l0 != -1 ) x . min0 = min ( x . min0 , r . l0 - l . r0 ) ; x . min1 = min ( l . min1 , r . min1 ) ; if ( l . r1 != -1 && r . l1 != -1 ) x . min1 = min ( x . min1 , r . l1 - l . r1 ) ; x . max0 = max ( l . max0 , r . max0 ) ; if ( l . l0 != -1 && r . r0 != -1 ) x . max0 = max ( x . max0 , r . r0 - l . l0 ) ; x . max1 = max ( l . max1 , r . max1 ) ; if ( l . l1 != -1 && r . r1 != -1 ) x . max1 = max ( x . max1 , r . r1 - l . l1 ) ; return x ; }