# python3 implementation of above approach
from math import ceil,log,floor
# Each segment of the segment tree would be a set
# to maintain distinct elements
segment=[[] for i in range(1000)]
# Build the segment tree
# i denotes current node, s denotes start and
# e denotes the end of range for current node
def build(i, s, e, arr):
# If start is equal to end then
# append the array element
if (s == e):
segment[i].append(arr[s])
return
# Else divide the range into two halves
# (start to mid) and (mid+1 to end)
# first half will be the left node
# and the second half will be the right node
build(2 * i, s, (s + e) // 2, arr)
build(1 + 2 * i, 1 + (s + e) // 2, e, arr)
# Insert the sets of right and left
# node of the segment tree
segment[i].append(segment[2 * i])
segment[i].append(segment[2 * i + 1])
# Query in an range a to b
def query(node, l, r, a, b):
left, right, result=[],[],[]
# If the range is out of the bounds
# of this segment
if (b < l or a > r):
return result
# If the range lies in this segment
if (a <= l and r <= b):
return segment[node]
# Else query for the right and left
# leaf node of this subtree
# and append them into the set
left = query(2 * node, l, (l + r) // 2, a, b)
result.append(left)
right = query(1 + 2 * node, 1 + (l + r) // 2, r, a, b)
result.append(right)
# Return the result
return result
def answer(ans):
d = {}
for i in str(ans):
if i not in ['[',',',']',' ']:
d[i]=1
return len(d)
# Initialize the segment tree
def init(n):
# Get the height of the segment tree
h = ceil(log(n, 2))
h = (2 * (pow(2, h))) - 1
# Function to get the result for the
# subarray from arr[l] to arr[r]
def getDistinct(l, r, n):
# Query for the range set
ans = query(1, 0, n - 1, l, r)
print(answer(str(ans)))
# Driver code
arr=[1, 1, 2, 1, 3]
n = len(arr)
init(n)
# Build the segment tree
build(1, 0, n - 1, arr)
# Query in range 0 to 4
getDistinct(0, 4, n)
# This code is contributed by mohit kumar 29