# Python3 implementation of the approach
# Node of a linked list
class Node:
def __init__(self, data = None, left = None,
right = None ):
self.data = data
self.right = right
self.left = left
maxLen = 30
# Array to store segment tree
segtree = [0]*(maxLen * 4)
# Function to create segment-tree to answer
# range-max query
def buildTree(l , r ,i , arr):
global segtree
global maxLen
# Base case
if (l == r) :
segtree[i] = l
return l
# Maximum index in left range
l1 = buildTree(l, int((l + r) / 2),
2 * i + 1, arr)
# Maximum index in right range
r1 = buildTree(int((l + r) / 2) + 1,r,
2 * i + 2, arr)
# If value at l1 > r1
if (arr[l1] > arr[r1]):
segtree[i] = l1
# Else
else:
segtree[i] = r1
# Returning the maximum in range
return segtree[i]
# Function to answer range max query
def rangeMax(l, r, rl, rr, i, arr):
global segtree
global maxLen
# Base cases
if (r < rl or l > rr):
return -1
if (l >= rl and r <= rr):
return segtree[i]
# Maximum in left range
l1 = rangeMax(l, int((l + r) / 2), rl,
rr, 2 * i + 1, arr)
# Maximum in right range
r1 = rangeMax(int((l + r) / 2) + 1, r, rl,
rr, 2 * i + 2, arr)
# l1 = -1 means left range
# was out-side required range
if (l1 == -1):
return r1
if (r1 == -1):
return l1
# Returning the maximum
# among two ranges
if (arr[l1] > arr[r1]):
return l1
else:
return r1
# Function to print the inorder
# traversal of the binary tree
def inorder(curr):
# Base case
if (curr == None):
return
# Traversing the left sub-tree
inorder(curr.left)
# Printing current node
print(curr.data, end= " ")
# Traversing the right sub-tree
inorder(curr.right)
# Function to build cartesian tree
def createCartesianTree(l , r , arr, n):
# Base case
if (r < l):
return None
# Maximum in the range
m = rangeMax(0, n - 1, l, r, 0, arr)
# Creating current node
curr = Node(arr[m])
# Creating left sub-tree
curr.left = createCartesianTree(l, m - 1, arr, n)
# Creating right sub-tree
curr.right = createCartesianTree(m + 1, r, arr, n)
# Returning current node
return curr
# Driver code
# In-order traversal of cartesian tree
arr = [ 8, 11, 21, 100, 5, 70, 55 ]
# Size of the array
n = len(arr)
# Building the segment tree
buildTree(0, n - 1, 0, arr)
# Building && printing cartesian tree
inorder(createCartesianTree(0, n - 1, arr, n))
# This code is contributed by Arnab Kundu