수의 변경이 빈번히 일어나는 수열의 부분합을 구하는 문제이다.
i 번째 수가 바뀌면 바뀐 크기만큼 i번째 부분합부터 N번째 부분합까지 바꾸는 방법으로 풀 수 있지만 수열의 크기가 , 중간에 숫자가 바뀌는 횟수가 이기 때문에 최악의 경우 100억번의 연산이 필요해서 다른 방법을 찾아야했다.
최종적으로 의 알고리즘을 찾아서 구현하였고 pypy3를 이용해 통과할 수 있다.
segment tree라는 것을 이용해 부분합을 더 빠르게 구할 수 있다고 한다. 나중에 찾아서 더 공부해야겠다는 생각이 들었다.
import sys
from collections import defaultdict
def input(): return sys.stdin.readline().rstrip()
n, m, k = map(int,input().split())
nums = [0] + [int(input()) for _ in range(n)]
partial_sum = [0] * (n+1)
for i in range(1,n+1):
partial_sum[i] = partial_sum[i-1] + nums[i]
diff = defaultdict(int)
for _ in range(m+k):
a, b, c = map(int,input().split())
if a == 1:
diff[b] = c-nums[b]
else:
diff_b, diff_c = 0,0
for k in diff.keys():
if k <= b-1: diff_b += diff[k]
if k <= c: diff_c += diff[k]
print(partial_sum[c] + diff_c - partial_sum[b-1] - diff_b)