class
SegmentTree:
def
__init__(
self
, n):
self
.tree
=
[
0
]
*
(
4
*
n)
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
]
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)
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
]
def
set_range(
self
, low, high):
self
.low
=
low
self
.high
=
high
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
)
if
__name__
=
=
'__main__'
:
arr
=
[
1
,
3
,
4
,
9
,
10
,
3
]
n
=
len
(arr)
i, j
=
1
,
4
print
(count_in_range(arr, n, i, j))
i, j
=
9
,
12
print
(count_in_range(arr, n, i, j))