DonHurry

[Python] ๋ฐฑ์ค€ 2042๋ฒˆ - ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ ๋ณธ๋ฌธ

Problem Solving

[Python] ๋ฐฑ์ค€ 2042๋ฒˆ - ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

_๋„๋… 2024. 1. 26. 13:44

๐Ÿ“– ๋ฌธ์ œ

 

2042๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜์ด๊ณ , K๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํšŸ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„

www.acmicpc.net

 

๐Ÿ”Ž ํ’€์ด

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„๋“ค์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ์— ๊ฐœ๋…๊ณผ ์ฝ”๋“œ ์„ค๋ช…์ด ์ž˜๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

[์ž๋ฃŒ๊ตฌ์กฐ] ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ (Segment Tree)

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)๋ž€?

velog.io

 

์œ„ ๋ธ”๋กœ๊ทธ์—์„œ ๊ฐœ๋…๊ณผ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์˜ค์…จ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์˜ ์›์†Œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ํ•จ์ˆ˜, ๊ตฌ๊ฐ„์„ ํ•ฉํ•˜๋Š” ํ•จ์ˆ˜ 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ ์ฃผ์˜ํ•  ์ ์€ ํŠธ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ํ›„์—, ๊ธฐ์กด ๋ฐฐ์—ด๋„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

import sys
input=sys.stdin.readline


# start, end: ์ˆซ์ž ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค
# idx: ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์˜ ์ธ๋ฑ์Šค (1๋ถ€ํ„ฐ)
def make_tree(start, end, idx):
    if start == end:
        tree[idx] = arr[start]
        return tree[idx]

    mid = (start + end) // 2
    tree[idx] = make_tree(start, mid, idx * 2) + make_tree(mid + 1, end, idx * 2 + 1)

    return tree[idx]


# target: ์ˆ˜์ •ํ•  ๊ฐ’์˜ ์ˆซ์ž ๋ฐฐ์—ด ์ธ๋ฑ์Šค
# value: ์ˆ˜์ •ํ•  ๊ฐ’ (๊ธฐ์กด ๊ฐ’์— ์–ผ๋งŒํผ ๋”ํ•ด์•ผ ํ•˜๋Š”์ง€์˜ ๊ฐ’)
def update_tree(start, end, idx, target, value):
    if target < start or target > end:
        return
    
    tree[idx] += value
    if start == end:
        return
    
    mid = (start + end) // 2
    update_tree(start, mid, idx * 2, target, value)
    update_tree(mid + 1, end, idx * 2 + 1, target, value)


# left, right: ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฒ”์œ„
def sum_tree(start, end, idx, left, right):
    if right < start or left > end:
        return 0

    if left <= start and right >= end:
        return tree[idx]

    mid = (start + end) // 2
    return sum_tree(start, mid, idx * 2, left, right) + sum_tree(mid + 1, end, idx * 2 + 1, left, right)


N, M, K = map(int, input().split())
arr = []
tree = [0] * (N * 4)  # ์ถฉ๋ถ„ํ•œ ํŠธ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณด
for _ in range(N):
    arr.append(int(input()))

make_tree(0, N-1, 1)
for _ in range(M + K):
    a, b, c = map(int, input().split())
    if a == 1:
        update_tree(0, N-1, 1, b-1, c - arr[b-1])
        arr[b-1] = c  # ๊ธฐ์กด ์ˆซ์ž ๋ฐฐ์—ด ๊ฐ’ ๋ณ€๊ฒฝ
    else:
        print(sum_tree(0, N-1, 1, b-1, c-1))