Hanbit the Developer
[Python] 백준 2042번: 구간 합 구하기(using fenwick-tree) 본문
https://www.acmicpc.net/problem/2042
import sys
input = sys.stdin.readline
def update_fenwick_tree(tree, index, value):
while index < len(tree):
tree[index] += value
index += (index & -index)
return tree
def query_fenwick_tree(tree, index):
res = 0
while index > 0:
res += tree[index]
index -= (index & -index)
return res
if __name__ == '__main__':
N, M, K = map(int, input().split())
tree = [0]*(N+1)
nums = [int(input()) for _ in range(N)]
for i in range(N):
tree = update_fenwick_tree(tree, i+1, nums[i])
for _ in range(M + K):
a, b, c = map(int, input().split())
if a == 1:
tree = update_fenwick_tree(tree, b, c - nums[b-1])
nums[b-1] = c
elif a == 2:
print(query_fenwick_tree(tree, c) - query_fenwick_tree(tree, b-1))
펜윅트리에 대한 설명은 아래 링크에 너무나도 잘 되어있다.
https://www.acmicpc.net/blog/view/21
펜윅트리를 구현한 뒤, update만 좀 신경써주면 된다. update는 값을 더하는 것이 기본이기 때문에, 가령 3을 7로 바꿔야한다고 하면 4를 인자로 넣어주는 것이다.
업데이트를 마친 뒤 nums(입력 받은 값, 트리가 아님)에 바뀐 값(7)을 넣어주어야한다.
'Algorithm > 백준' 카테고리의 다른 글
[C] 백준 2750번: 수 정렬하기(선택 정렬) (0) | 2021.10.20 |
---|---|
[Python] 백준 11051번: 이항 계수 2 (0) | 2021.10.11 |
[Python] 백준 14939번: 불 끄기 (0) | 2021.10.06 |
[백준] 2981번: 검문 (0) | 2021.10.04 |
[Python] 백준 1904번: 01타일 (0) | 2021.09.29 |