백준 2042 - 구간 합 구하기 (Python)

Updated:

이번 문제에서 세그먼트 트리를 사용하는 이유는 구간합을 빠르게 검색하고 수정하기 위해서입니다.
개념 자체는 쉬우니 바로 코드를 보고 이해하시면 됩니다.

전체코드

import sys

input = sys.stdin.readline

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

def make_segment_tree(s, e, index):
    if s == e:
        segment_tree[index] = leaf[s-1]
        return segment_tree[index]
	
    mid = (s + e) // 2
    segment_tree[index] = make_segment_tree(s, mid, index*2) + make_segment_tree(mid+1, e, index*2+1)
    
    return segment_tree[index]

def find(s, e, i, l, r):
    if s > r or e < l:
        return 0
        
    if s >= l and e <= r:
        return segment_tree[i]

    mid = (s + e) // 2
    
    return find(s, mid, i * 2, l, r) + find(mid + 1, e, i * 2 + 1, l, r)

def update(s, e, i, update_idx, update_data):
    if s > update_idx or e < update_idx:
        return
    
    segment_tree[i] += update_data
	
    if s == e:
        return

    mid = (s + e) // 2
    update(s, mid, i * 2, update_idx, update_data)
    update(mid+1, e, i * 2 + 1, update_idx, update_data)

make_segment_tree(1, N, 1)

for _ in range(M + K):
    a, b, c = map(int, input().split())
    
    if a == 1:
        temp = c - leaf[b - 1]
        leaf[b - 1] = c
        update(1, N, 1, b, temp)
    elif a == 2:
        print(find(1, N, 1, b, c))

Categories:

Updated: