問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
class BIT():
def cnt2(self, I): #2で何回割れるか計算する
k = 0
while I % 2 == 0:
k += 1
I = I // 2
return k
def __init__(self, n, A): #BITの作成
self.Tree = [0]* (n + 1) #0で初期化
self.n = n
for i in range(1, n + 1):
k=self.cnt2(i)
for j in range(i - 2 ** k, i): #インデックス注意
self.Tree[i] += A[j]
def add(self, id, x): #A[id]にxを足す作業
self.Tree[id] += x
now = id
while True:
k = self.cnt2(now)
now = now + 2 ** k #親に移動
if now > self.n: #該当するものがないなら根にたどり着いたということ
break
self.Tree[now] += x #加算処理
def sum(self, id): #A[id] までの累積和を計算
#問題 6,7 で実装
入力は以下のフォーマットで与えられます。
Q
t_1
t_2
...
t_Q
答えを Q 行で出力してください。
i (1 ≦ i ≦ Q) 行目には、i 番目のクエリの答えを出力してください。
すべてのテストケースについて以下の条件を満たします。
8
10
25
77
7
1
2
63
64
10 8 0
25 24 16 0
77 76 72 64 0
7 6 4 0
1 0
2 0
63 62 60 56 48 32 0
64 0