# Python program for range greatest
# pair sum query using segment tree
# A utility function
def util(x, y):
ans = {}
# Find the maximum pair sum
ans['greatestPSum'] = max(x['maxVal'] + y['maxVal'], max(x['greatestPSum'], y['greatestPSum']))
# Find the maximum value
ans['maxVal'] = max(x['maxVal'], y['maxVal'])
return ans
# A utility function to get the
# middle index from corner indexes.
def getMid(s, e):
return s + (e - s) // 2
# A recursive function to get the
# greatest pair sum value in a given range
# of array indexes. Here:
# index --> Index of current node in the
# segment tree. Initially 0 is
# passed as root is always at index 0
# ss & se --> Starting and ending indexes
# of the segment represented
# by current node, i.e., st[index]
# qs & qe --> Starting and ending indexes
# of query range
def query(ss, se, qs, qe, index, st):
# If segment of this node is a part
# of given range, then return
# the min of the segment
if qs <= ss and qe >= se:
return st[index]
temp = {}
temp['maxVal'], temp['greatestPSum'] = -1, -1
# If segment of this node
# is outside the given range
if se < qs or ss > qe:
return temp
# If a part of this segment
# overlaps with the given range
mid = getMid(ss, se)
return util(query(ss, mid, qs, qe, 2 * index + 1, st), query(mid + 1, se, qs, qe, 2 * index + 2, st))
# Function to return the greatest pair
# sum in the range from index
# qs (query start) to qe (query end)
def checkQuery(n, qs, qe, st):
temp = {}
temp['maxVal'], temp['greatestPSum'] = -1, -1
# Check for erroneous input values
if qs < 0 or qe > n - 1 or qs > qe:
print("Invalid Input")
return temp
return query(0, n - 1, qs, qe, 0, st)
# A recursive function that constructs
# Segment Tree for array[ss..se].
# si is index of current node in segment tree
def constructST(arr, ss, se, si, st):
# If there is one element in array,
# store it in current node of
# segment tree and return
if ss == se:
st[si] = {'maxVal': arr[ss], 'greatestPSum': 0}
return st[si]
# If there are more than one elements,
# then recur for left and right subtrees
mid = getMid(ss, se)
st[si] = util(constructST(arr, ss, mid, si * 2 + 1, st), constructST(arr, mid + 1, se, si * 2 + 2, st))
return st[si]
# Utility function to find the
# greatest pair sum for the given
# queries
def operation(arr, n, qs, qe):
st = [{} for i in range(4*n)]
# Build segment tree from given array
constructST(arr, 0, n - 1, 0, st)
ans = checkQuery(n, qs, qe, st)
# Print minimum value in arr[qs..qe]
print(ans['greatestPSum'])
# Driver code
arr = [1, 3, 2, 7, 9, 11]
n = len(arr)
L, R = 1, 4
operation(arr, n, L, R)