xs = [2, 1, 5, 3, 4]
op = lambda x, y: x + y
tree = {}

def build(node, L, R):
    if L == R:
        tree[node] = xs[L] 
    else:
        mid = (L + R) // 2
        build(2 * node, L, mid) 
        build(2 * node + 1, mid + 1, R)
        tree[node] = op(tree[2 * node], tree[2 * node + 1]) 
build(1, 0, len(xs) - 1
     )

print(tree)

def query(node, L, R, qL, qR):
    print(L, R)
    if qL > qR: 
        return 0
    if qL == L and qR == R:
        return tree[node]
    mid = (L + R) // 2
    left = query(2 * node, L, mid, qL, min(qR, mid))
    right = query(2 * node + 1, mid + 1, R, max(qL, mid + 1), qR)
    print("left :", left)
    print("right :", right)
    return op(left, right)

l, r = 0, 4
f = lambda x: x
print(type(f))
ans = query(1, 0, 4, l, r)
print(ans)

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: