Fenwick Tree

長さ $N$ の配列に対し、

を $O(\log N)$ で求めることが出来るデータ構造です。

コンストラクタ

fenwick_tree<T> fw(int n)

制約

計算量

add

void fw.add(int p, T x)

a[p] += x を行う

制約

計算量

sum

T fw.sum(int l, int r)

a[l] + a[l - 1] + ... + a[r - 1] を返す。 T が整数型(int / uint / ll / ull)の場合、答えがオーバーフローしたならば $\bmod 2^{\mathrm{bit}}$ で等しい値が返る。

制約

計算量

使用例

AC code of https://atcoder.jp/contests/practice2/tasks/practice2_b

#include <atcoder/fenwicktree> #include <cstdio> using namespace std; using namespace atcoder; int main() { int n, q; scanf("%d %d", &n, &q); fenwick_tree<long long> fw(n); for (int i = 0; i < n; i++) { int a; scanf("%d", &a); fw.add(i, a); } for (int i = 0; i < q; i++) { int t; scanf("%d", &t); if (t == 0) { int p, x; scanf("%d %d", &p, &x); fw.add(p, x); } else { int l, r; scanf("%d %d", &l, &r); printf("%lld\n", fw.sum(l, r)); } } }