import
math
def
getMid(s:
int
, e:
int
)
-
>
int
:
return
s
+
(e
-
s)
/
/
2
def
isArmstrong(x:
int
)
-
>
bool
:
n
=
len
(
str
(x))
sum1
=
0
temp
=
x
while
(temp >
0
):
digit
=
temp
%
10
sum1
+
=
pow
(digit, n)
temp
/
/
=
10
if
(sum1
=
=
x):
return
True
return
False
def
MaxUtil(st, ss, se, l, r, node):
if
(l <
=
ss
and
r >
=
se):
return
st[node]
if
(se < l
or
ss > r):
return
-
1
mid
=
getMid(ss, se)
return
max
(MaxUtil(st, ss, mid, l, r,
2
*
node
+
1
),
MaxUtil(st, mid
+
1
, se, l, r,
2
*
node
+
2
))
def
updateValue(arr, st, ss, se, index, value, node):
if
(index < ss
or
index > se):
print
(
"Invalid Input"
)
return
if
(ss
=
=
se):
arr[index]
=
value
if
(isArmstrong(value)):
st[node]
=
value
else
:
st[node]
=
-
1
else
:
mid
=
getMid(ss, se)
if
(index >
=
ss
and
index <
=
mid):
updateValue(arr, st, ss, mid, index, value,
2
*
node
+
1
)
else
:
updateValue(arr, st, mid
+
1
, se, index, value,
2
*
node
+
2
)
st[node]
=
max
(st[
2
*
node
+
1
], st[
2
*
node
+
2
])
return
def
getMax(st, n, l, r):
if
(l <
0
or
r > n
-
1
or
l > r):
print
(
"Invalid Input"
)
return
-
1
return
MaxUtil(st,
0
, n
-
1
, l, r,
0
)
def
constructSTUtil(arr, ss, se, st, si):
if
(ss
=
=
se):
if
(isArmstrong(arr[ss])):
st[si]
=
arr[ss]
else
:
st[si]
=
-
1
return
st[si]
mid
=
getMid(ss, se)
st[si]
=
max
(constructSTUtil(arr, ss, mid, st, si
*
2
+
1
),
constructSTUtil(arr, mid
+
1
, se, st, si
*
2
+
2
))
return
st[si]
def
constructST(arr, n):
x
=
int
(math.ceil(math.log2(n)))
max_size
=
2
*
int
(math.
pow
(
2
, x))
-
1
st
=
[
0
for
_
in
range
(max_size)]
constructSTUtil(arr,
0
, n
-
1
, st,
0
)
return
st
if
__name__
=
=
"__main__"
:
arr
=
[
192
,
113
,
535
,
7
,
19
,
111
]
n
=
len
(arr)
st
=
constructST(arr, n)
print
(
"Maximum armstrong number in given range = {}"
.
format
(
getMax(st, n,
1
,
3
)))
updateValue(arr, st,
0
, n
-
1
,
1
,
153
,
0
)
print
(
"Updated Maximum armstrong number in given range = {}"
.
format
(
getMax(st, n,
1
,
3
)))