fenwicktree - shakayami/ACL-for-python GitHub Wiki

fenwick tree

数列(a_i)(i=0,...,n-1)に対して以下のクエリを高速に行えます。

  • a_iをxに更新する
  • kに対して、a_0+...+a_{k-1}を求める

初期化

FT=fenwick_tree(N)

Nは配列のサイズです。 初期化した時、最初の配列のサイズは全て0になっています。 【注意】もしバグったら、まずは初期値を間違えてないか確認しましょう。

更新

FT.add(i,a)

i番目の値をaに更新します

和を求める1

print(FT.sum0(r))

a_0+...+a_{r-1}の総和、つまりsum(a[:r])を求めます。

和を求める2

print(FT.sum(l,r))

a_l+...+a_{r-1}の総和、つまりsum(a[l:r])を求めます。

使用例

使用例1

(https://atcoder.jp/contests/practice2/tasks/practice2_b)

class fenwick_tree():
    #(中略)
 
N,Q=map(int,input().split())
a=[int(i) for i in input().split()]
FT=fenwick_tree(N)
for i in range(N):
    FT.add(i,a[i])
#ここまで初期化
#ここからクエリに答える
for i in range(Q):
    t,a,b=map(int,input().split())
    if t==0:
        FT.add(a,b)
    else:
        print(FT.sum(a,b))