👀 문제 사이트 : https://www.acmicpc.net/problem/11505
이 문제는 숫자가 저장된 배열에서 최대합, 혹은 최대곱 등을 효율적으로 구할 수 있도록 값을 저장하는 세그먼트 트리 정의를 그대로 나타낸 문제이다.
import sys
# 세그먼트 트리 build (1000000007 이하)
def segment_tree_build(node, start, end):
if start == end:
tree[node] = numbers[start - 1]
else:
mid = (start + end) // 2
segment_tree_build(node * 2, start, mid)
segment_tree_build(node * 2 + 1, mid + 1, end)
tree[node] = (tree[node * 2] * tree[node * 2 + 1]) % 1000000007
# 세그먼트 트리에서 구간 곱 구하기
def segment_tree_rangemul(node, start, end, left, right):
if start > right or end < left:
return 1
if start >= left and end <= right:
return tree[node]
mid = (start + end) // 2
p1 = segment_tree_rangemul(node * 2, start, mid, left, right)
p2 = segment_tree_rangemul(node * 2 + 1, mid + 1, end, left, right)
return p1 * p2
# 세그먼트 트리에서 업데이트하기
def segment_tree_update(node, start, end, idx, val):
if start == end:
numbers[idx - 1] = val
tree[node] = val
else:
mid = (start + end) // 2
if start <= idx and idx <= mid:
segment_tree_update(node * 2, start, mid, idx, val)
else:
segment_tree_update(node * 2 + 1, mid + 1, end, idx, val)
tree[node] = (tree[node * 2] * tree[node * 2 + 1]) % 1000000007
input = sys.stdin.readline
n, m, k = map(int, input().split())
numbers = []
tree = [0] * (10 * n)
for _ in range(n):
numbers.append(int(input()))
segment_tree_build(1, 1, n)
for _ in range(m + k):
a, b, c = map(int, input().split())
if a == 1:
# update
segment_tree_update(1, 1, n, b, c)
if a == 2:
# range
print(segment_tree_rangemul(1, 1, n, b, c) % 1000000007)