# Python program to count number of elements
# with values in given range using segment tree
# Segment Tree class
class SegmentTree:
def __init__(self, n):
self.tree = [0] * (4*n)
# build the tree with array elements
def build(self, arr, v, tl, tr, low, high):
if tl == tr:
self.tree[v] = 1 if low <= arr[tl] <= high else 0
else:
tm = (tl + tr) // 2
self.build(arr, v*2, tl, tm, low, high)
self.build(arr, v*2+1, tm+1, tr, low, high)
self.tree[v] = self.tree[v*2] + self.tree[v*2+1]
# query the tree for given range
def query(self, v, tl, tr, l, r):
if l > r:
return 0
if l == tl and r == tr:
return self.tree[v]
tm = (tl + tr) // 2
return self.query(v*2, tl, tm, l, min(r, tm)) + \
self.query(v*2+1, tm+1, tr, max(l, tm+1), r)
# update tree at index i with given value
def update(self, v, tl, tr, i, val, low, high):
if tl == tr:
self.tree[v] = 1 if low <= val <= high else 0
else:
tm = (tl + tr) // 2
if i <= tm:
self.update(v*2, tl, tm, i, val, low, high)
else:
self.update(v*2+1, tm+1, tr, i, val, low, high)
self.tree[v] = self.tree[v*2] + self.tree[v*2+1]
# set range for the tree
def set_range(self, low, high):
self.low = low
self.high = high
# function to count elements within given range
def count_in_range(arr, n, x, y):
st = SegmentTree(n)
st.set_range(x, y)
st.build(arr, 1, 0, n-1, x, y)
return st.query(1, 0, n-1, 0, n-1)
# driver function
if __name__ == '__main__':
arr = [1, 3, 4, 9, 10, 3]
n = len(arr)
# Answer queries
i, j = 1, 4
print(count_in_range(arr, n, i, j))
i, j = 9, 12
print(count_in_range(arr, n, i, j))