백준 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))