알고리즘 문제풀이

가계부(백준12837)

wiojfe 2023. 7. 20. 18:09
  • 전형적인 세그먼트 트리 문제이다
  • 특정 날짜에 대한 수입 혹은 지출을 입력으로 받을 때 유의해야 한다. 배열의 값을 아예 변경하면 안 되고 변화량을 더해야 한다. 
import sys 
input = sys.stdin.readline 
n,q =map(int, input().split())
tree = [0 for _ in range((4*n)+1)]
arr = [0 for _ in range(n+1)]

def change(idx, s,e,place, value):
    if place < s or place> e :
        return 
    if s==e :
        tree[idx]=arr[s]
        return 
    mid= (s+e)//2
    change(idx*2, s,mid,place, value) 
    change(idx*2+1, mid+1,e,place,value)
    tree[idx] = tree[idx*2]+ tree[idx*2+1] 
    
    
def find(idx,s,e,left,right):
    if ( e <left or right < s):
        return 0 
    if (left <= s and e <= right ):
        return tree[idx] 
    mid = (s+e)//2 
    return find(idx*2,s,mid,left,right)+find(idx*2+1,mid+1,e,left,right) 
    
        
for i in range(q):
    a,b,c =map(int, input().split())
    if a ==1 :   # 지출 변화를 추가 
        arr[b] += c 
        change(1,1,n,b,c)
    else : # b~ c 까지의 지출변화 
        print(find(1,1,n,b,c))