๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

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

Dbswnstjd 2023. 4. 24. 11:07

๋ฌธ์ œ

https://www.acmicpc.net/problem/2042

ํ’€์ด

# ๋ฐฑ์ค€ 2042๋ฒˆ ๋ฌธ์ œ - ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ
# 0. ์ž…๋ ฅ๋ฐ›๊ธฐ
import sys
input = sys.stdin.readline

n, m, k = map(int,input().split())

arr = []
segment_tree = [0]*(n*4)


# 1. ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ
def init(start, end, index):
	# start์™€ end๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋ฆฌํ”„๋…ธ๋“œ์ด๋‹ค.
    if start == end:
        segment_tree[index] = arr[start-1]
        return segment_tree[index]
	
    # ํ˜„์žฌ ๋…ธ๋“œ๋Š” ์™ผ์ชฝ ์•„๋ž˜ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋…ธ๋“œ๋ฅผ ๋”ํ•œ ๊ฐ’์ด๋‹ค.
    mid = (start+end) // 2
    segment_tree[index] = init(start, mid, index*2) + init(mid+1, end, index*2+1)
    return segment_tree[index]

       
# 2. ํŠธ๋ฆฌ์—์„œ ๊ฐ’ ์ฐพ๊ธฐ
def find(start, end, index, left, right):
	# ์ฐพ์œผ๋ ค๋Š” ๋ฒ”์œ„๊ฐ€ start~end ๋ฒ”์œ„๋ณด๋‹ค ํด ๊ฒฝ์šฐ
    if start > right or end < left:
        return 0
        
    # ์ฐพ์œผ๋ ค๋Š” ๋ฒ”์œ„๊ฐ€ segment tree ๋…ธ๋“œ์•ˆ์— ๊ตฌํ˜„๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ
    if start >= left and end <= right:
        return segment_tree[index]

	# ์ฝ”๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ฝ”๋“œ
    # ํ˜„์žฌ ๋…ธ๋“œ๋Š” ์™ผ์ชฝ์•„๋ž˜ + ์˜ค๋ฅธ์ชฝ์•„๋ž˜ ๋…ธ๋“œ์ด๋‹ค.
    mid = (start + end) // 2
    sub_sum = find(start, mid, index*2, left, right) + find(mid+1, end, index*2+1, left, right)
    return sub_sum


# 3. ํŠธ๋ฆฌ ๊ฐ’ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
def update(start, end, index, update_idx, update_data):
	# update ํ•˜๋ ค๋Š” ๋ฒ”์œ„๊ฐ€ ์ดˆ๊ณผ๋  ๊ฒฝ์šฐ
    if start > update_idx or end < update_idx:
        return
    
    segment_tree[index] += update_data
	
    # ๋ฆฌํ”„๋…ธ๋“œ๊นŒ์ง€ ๋ฐ”๊ฟ”์ฃผ์—ˆ์œผ๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋๋‚ธ๋‹ค.
    if start == end:
        return

	# ๋‚ด๊ฐ€ ๊ด€์—ฌํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ์ฐพ์•„์„œ ๋ฐ”๊ฟ”์ค€๋‹ค -> ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„
    mid = (start + end) // 2
    update(start, mid, index*2, update_idx, update_data)
    update(mid+1, end, index*2+1, update_idx, update_data)


for _ in range(n):
    arr.append(int(input()))

init(1, n, 1)

for _ in range(m+k):
    a, b, c = map(int,input().split())
    if a == 1:
        temp = c - arr[b-1]
        arr[b-1] = c
        update(1, n, 1, b, temp)

    elif a == 2:
        print(find(1, n, 1, b, c))

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋ฌธ์ œ์ด๋‹ค. ์ฒ˜์Œ ์ ‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์„œ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.