問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
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] までの累積和を計算
ans = 0
#足すべき範囲が0になるまで足し続ける
while id > 0:
ans += self.Tree[id]
id -= 2 ** self.cnt2(id) #すでに足したものを除くため更新
return ans
入力は以下のフォーマットで与えられます。
n
A_1 A_2 ... A_n
Q
q_1 p_1 X_1
q_2 p_2 X_2
...
q_Q p_Q X_Q
q_i = 2 となる i の個数を T としたとき答えを T 行で出力してください。
j (1 ≦ j ≦ T) 行目には、q_i = 2 となるクエリの中で前から j 番目のクエリの答えを出力してください。
すべてのテストケースについて以下の条件を満たします。
10
2 7 1 8 2 8 1 8 2 8
10
2 5 0
2 10 0
2 1 0
1 6 10
2 5 0
2 10 0
1 1 9
1 3 8
2 1 0
2 5 0
20
47
2
20
57
11
37