본문 바로가기

프로그래밍/알고리즘/C++

[C++] 펜윅트리 (이진 인덱스 트리) - 구간합 구해주는 트리

struct FenwickTree {

   vector<inttree;

   FenwickTree(int n) : tree(n + 1) {}

   inline int sum(int pos) {

       ++pos;

       int ret = 0;

       while (pos > 0) {

          ret += tree[pos];

          pos &= (pos - 1);

       }

       return ret;

   }

   inline void add(int posint val) {

       ++pos;

       while (pos < (inttree.size()) {

          tree[pos] += val;

          pos += (pos & -pos);

       }

   }

};



사용법

생성자 FenwickTree fenwickTree(n) : n은 들어갈 노드의 개수

int sum(int pos) : 0번~pos번째까지의 합을 구해준다.(내부적으로 1~pos+1로 동작)

void add(int pos, int val) : pos번째 노드에 val을 더해준다.


성능

합이랑 더하기 시간복잡도 모두 O(lgN)


응용

5~8번 노드의 구간합은 fenwickTree.sum(8) - fenwickTree.sum(5-1)