Binary Indexed Tree (BIT) / Fenwick Treeは、配列の区間和クエリと一点更新を効率的に行うデータ構造です。
各BIT[i]は、特定の範囲の要素の合計を格納します。
| BIT Index | バイナリ | 担当範囲 | 計算 | 値 |
|---|---|---|---|---|
| BIT[1] | 001 | A[1] | 1 | 1 |
| BIT[2] | 010 | A[1] + A[2] | 1 + 5 | 6 |
| BIT[3] | 011 | A[3] | 7 | 7 |
| BIT[4] | 100 | A[1] + A[2] + A[3] + A[4] | 1 + 5 + 7 + 9 | 22 |
| BIT[5] | 101 | A[5] | 8 | 8 |
| BIT[6] | 110 | A[5] + A[6] | 8 + 6 | 14 |
idx & (-idx)LSBは、そのインデックスが担当する範囲の大きさを示します。
インデックス5から開始して、LSBを加算しながら進む:
| BITインデックス | 更新前 | 更新後 | 変化 |
|---|---|---|---|
| BIT[5] | 8 | 18 | +10 |
| BIT[6] | 14 | 24 | +10 |
| その他 | 変更なし | 変更なし | 0 |
更新パス: 5 → 6
結果: [0, 1, 6, 7, 22, 12, 18]
更新パス: 1 → 2 → 4
結果: [0, 11, 16, 7, 32, 12, 18]