Binary Indexed Tree
Segment Tree보다 범용성은 낮지만 훨씬 가볍고 실행 속도도 조금 더 빠른 Binary Indexed Tree(Fenwick Tree)에 대해 설명하겠습니다.
Fenwick Tree는 Segment Tree처럼 구간의 정보를 log(n)으로 찾고, update하는 자료구조입니다. 하지만 세그먼트 트리가 모든 구간 [l,r]에 대하여 find, update할 수 있는데 반해 Fenwick Tree는 [1,x] 구간만을 find, update할 수 있습니다.
따라서 Fenwick Tree에서는 구간 [l,r]의 최댓값이나 최솟값 등을 찾기 어렵습니다. (구간의 합, 곱과 같은 정보는 Fenwick에서도 찾을 수 있습니다.)
1. Update
void update(int i, int d){
while(i<=n){
bit[i]+=d;
i+=(i&-i);
}
}
2. Find
int find(int i){
int ans=0;
while(i>0){
ans+=bit[i];
i-=(i&-i);
}
return ans;
}