# Python program to calculate sum
# in an interval and update with
# square root
from typing import List
import bisect
from math import sqrt, floor
# Maximum size of input array
MAX = 100
BIT = [0 for _ in range(MAX + 1)]
# structure for queries with members type,
# leftIndex, rightIndex of the query
class queries:
def __init__(self, type: int = 0, l: int = 0, r: int = 0) -> None:
self.type = type
self.l = l
self.r = r
# function for updating the value
def update(x: int, val: int, n: int) -> None:
a = x
while a <= n:
BIT[a] += val
a += a & -a
# function for calculating the required
# sum between two indexes
def sum(x: int) -> int:
s = 0
a = x
while a:
s += BIT[a]
a -= a & -a
return s
# function to return answer to queries
def answerQueries(arr: List[int], que: List[queries], n: int, q: int) -> None:
# Declaring a Set
s = set()
for i in range(1, n):
# inserting indexes of those numbers
# which are greater than 1
if (arr[i] > 1):
s.add(i)
update(i, arr[i], n)
for i in range(q):
# update query
if (que[i].type == 1):
while True:
ss = list(sorted(s))
# find the left index of query in
# the set using binary search
# auto it = s.lower_bound(que[i].l);
it = bisect.bisect_left(ss, que[i].l)
# if it crosses the right index of
# query or end of set, then break
if it == len(s) or ss[it] > que[i].r:
break
que[i].l = ss[it]
# update the value of arr[i] to
# its square root
update(ss[it], floor(sqrt(arr[ss[it]]) - arr[ss[it]]), n)
arr[ss[it]] = floor(sqrt(arr[ss[it]]))
# if updated value becomes equal to 1
# remove it from the set
if (arr[ss[it]] == 1):
s.remove(ss[it])
# increment the index
que[i].l += 1
# sum query
else:
print(sum(que[i].r) - sum(que[i].l - 1))
# Driver Code
if __name__ == "__main__":
q = 4
# input array using 1-based indexing
arr = [0, 4, 5, 1, 2, 4]
n = len(arr)
# declaring array of structure of type queries
que = [queries() for _ in range(q + 1)]
que[0].type, que[0].l, que[0].r = 2, 1, 5
que[1].type, que[1].l, que[1].r = 1, 1, 2
que[2].type, que[2].l, que[2].r = 1, 2, 4
que[3].type, que[3].l, que[3].r = 2, 1, 5
# answer the Queries
answerQueries(arr, que, n, q)
# This code is contributed by sanjeev2552