백준 11505 - 구간 곱 구하기 (Python)

Updated:

구간 합 구하기 문제와 거의 유사합니다.
더하기 부분을 곱셈으로만 변경했습니다.
특히 find함수에서 구간을 벗어났을 때 곱하기 연산이기 때문에 1을 반환하는게 중요합니다.

전체코드

import sys

input = sys.stdin.readline
DIV = 1000000007

N, M, K = map(int,input().split())
leaf = [-1] + [int(input()) for _ in range(N)]
tree = [0] * (N * 4)

def init(start, end, index):
    if start == end:
        tree[index] = leaf[start]
    else:
        mid = (start + end) // 2
        tree[index] = init(start, mid, index * 2) * init(mid + 1, end, index * 2 + 1) % DIV
    
    return tree[index]

def find(start, end, index, l, r):
    if start > r or end < l:
        return 1
        
    if start >= l and end <= r:
        return tree[index]

    mid = (start + end) // 2
    
    return find(start, mid, index * 2, l, r) * find(mid + 1, end, index * 2 + 1, l, r) % DIV

def update(start, end, index, target, value):
    if start > target or end < target:
        return
	
    if start == end:
        tree[index] = value
        return

    mid = (start + end) // 2
    update(start, mid, index * 2, target, value)
    update(mid + 1, end, index * 2 + 1, target, value)

    tree[index] = tree[index * 2] * tree[index * 2 + 1] % DIV

init(1, N, 1)

for _ in range(M + K):
    a, b, c = map(int, input().split())
    
    if a == 1:
        update(1, N, 1, b, c)
        leaf[b] = c
        continue

    print(find(1, N, 1, b, c))

Categories:

Updated: