https://www.youtube.com/watch?v=1d9sqmuLy-o&list=PLFgS-xIWwNVX-zm4m6suWC9d7Ua9z7fuT&index=37
2^k >= N
을 만족하는 K값을 구한 후 2^k * 2
를 트리 배열의 크기로 지정2^k
를 시작 인덱스로 취한다.2^k -1
부터 1번쪽으로 채움)2N
, 2N+1
이 됨세그먼트 트리 index = 주어진 질의 index + 2^K - 1
(index+1)/2
,(index-1)/2
로 수행start_index = 2+7=9
end_index = 6+7=13
start_index %2 = 9 % 2 = 1 //노드 선택
// 1이 나왔다는 것은 인덱스가 오른쪽을 뜻함
// 오른쪽인 경우 부모 노드를 사용하면 안됨 => 해당 부모 노드의 왼쪽도 가지고 있기 때문에 미선택
// 독립노드로 선택 해 놓음 (8)
// 이미 해당 노드의 부모 노드는 사용하면 안되기 때문에 옆 부모 노드로 가야함
// 8의 부모노드인 13이 아닌 7을 선택
end_index %2 = 13 % 2 = 1 // 노드 미선택
// 해당 노드를 품고있는 부모 노드가 있기 때문에 해당 노드를 선택하지않고 부모 노드로 뛰어 올라감
start_index = (start_index +1) /2 = 10 /2 = 5
// +1을 하는 이유는 독립 노드로 선택되어 8의 부모 노드인 13이 아닌 7을 선택해야 하기 때문에
end_index = (end_index -1) /2 = 12/2 =6
// 독립 노드로 선택되지 않았기 때문에
start_index %2 = 5%2 = 1 // 노드 선택
end_index %2 = 6%2 = 0 // 노드 선택
start_index = (start_index +1) /2 = 6/2 = 3
end_index = (end_index -1) /2 = 5/2 =2
//end_index <start_index이므로 종료
선택된 7, 9, 8 을 더하면 [9] ~ [13]의 구간 합이 나온다.
어떤 값을 업데이트 할 것인지에 관해서는 트리 타입별로 다르다
→ 부모 노드로 이동하는 방식은 세그먼트 트리가 이진 트리이므로 index = index = index/2
로 변경
구간합 : 원래 데이터와 변경 데이터의 차이만큼 부모 노드로 올라가면서 변경
최댓값 : 변경 데이터와 자신과 같은 부모를 지니고 있는 다른 자식 노드와 비교하면서 더 큰 값으로 업데이트, 업데이트가 일어나지 않으면 종료
최솟값 변경 데이터와 자신과 같은 부모를 지니고 있는 다른 자식 노드와 비교하면서 더 작은 값 으로 업데이트, 업데이트가 일어나지 않으면 종료