세그먼트 트리: 주어진 데이터의 구간 합과 데이터 업데이트를 빠르게 수행하기 위한 자료구조. 이때 ‘구간 합’ 이라는 것은 합 배열을 뜻한다.

사진을보면 합 배열의 현재 인덱스 값을 그전의 인덱스 값을 모두 더한 것과 같다.

왜 세그먼트 트리를 사용해야 될까?

세그먼트 트리의 종류
세그먼트 트리 구현하기
트리 초기화 하기
leaf 노드의 개수가 데이터의 개수(N) 이상이 되도록 트리 배열을 만든다.
ex) Sample data → { 5, 8, 4, 3, 7, 2, 1, 6 }
트리의 leaf 노드에 원본 data가 들어간다. 이때 leaf 노드의 시작 위치를 찾아야 하는데, 구하는 방식은 2^k를 시작 인덱스로 취하면 된다. Sample data에서 k=3이므로 start index=8이 된다.


세그먼트 트리의 조건에 맞게 트리를 구성한다
구간 합

끝에서부터 탐색을 해주고, 구간 양쪽 자식의 합을 자신의 부모에 update하는 방식으로 root까지 진행한다.

최대

최소

주어진 쿼리 인덱스를 세그먼트 트리 인덱스로 변경하는 방법
쿼리값을 구하는 과정