Saltar al contenido principal
Data structures, algorithms, and the core CS foundations — plus an optional advanced track for expert topics.

Core Computer Science

Data structures, algorithms, and the core CS foundations — plus an optional advanced track for expert topics.

Fenwick Tree Visualizer

Build

Paso 0 / 0
Speed 100ms
Step Progress 0 / 0
Elements 0
Result —
Status Ready
Active BIT node
Covered array range
BIT / array cell
Step Explanation

bit[i] stores a sum of the range ending at i — prefix sums and updates both run in O(log n).

Pseudocode
 

Fenwick Tree (Binary Indexed Tree)

Intermediate (3/5) ~1 hora Range sum con punto updates Estructura compacta: array 1-based LSB operation: i & -i O(log n) update y query Prereqs: Arrays, Bit manipulation

Fenwick Tree (o Binary Indexed Tree, BIT) es una estructura compacta para prefix sums y point updates en O(log n). Es más simple y rápida que segment tree para operaciones de suma.

La magia está en usar el bit menos significativo (LSB) para saltar entre nodos relevantes.

Estructura

Array 1-based bit[1..n] donde bit[i] almacena la suma de un rango específico.

LSB: i & -i da el bit menos significativo de i.

  • i += (i & -i): salta al siguiente nodo que cubre el rango actual (para update).
  • i -= (i & -i): salta al nodo padre (para query).

Point Update

add(i, delta):

  • Mientras i <= n: bit[i] += delta, luego i += (i & -i).

Prefix Query

sum(i):

  • Inicializa res = 0.
  • Mientras i > 0: res += bit[i], luego i -= (i & -i).

Range Query

range_sum(l, r) = sum(r) - sum(l-1).

Ejemplo

Array: [1, 3, 5, 7, 9], n = 5.

Construye BIT con updates:

  • add(1,1): actualiza bit[1], bit[2], bit[4].
  • add(2,3): actualiza bit[2], bit[4].
  • add(3,5): actualiza bit[3], bit[4].
  • add(4,7): actualiza bit[4].
  • add(5,9): actualiza bit[5].

sum(3) = bit[3] + bit[2] = 5 + 4 = 9 = 1 + 3 + 5.

Comparación

OperaciónFenwickSegment TreePrefix Array
Point updateO(log n)O(log n)O(n)
Range sumO(log n)O(log n)O(1)
Range updateNo nativoO(log n)No
EspacioO(n)O(4n)O(n)

Limitaciones

  • No soporta range update nativamente — requiere técnica de “two BITs” o conversión a point updates.
  • Solo operaciones asociativas — suma, xor, gcd; no min/max con updates arbitrarias.
  • 1-based — requiere conversión desde 0-based arrays.

Aplicaciones

  • Dinamic programming — prefix sums con updates
  • Inversion count — BIT sobre valores comprimidos
  • Range queries — cuando solo necesitas suma
  • Enseñanza — introduce LSB y trees compactas

Trayectoria de Práctica

  1. Implementa Fenwick tree; traza add y sum.
  2. Implementa range sum: range_sum(l,r) = sum(r) - sum(l-1).
  3. Investiga build O(n): ¿cómo construye desde array en tiempo lineal?
  4. Investiga two BITs para range update + range query.
  5. Compara con segment tree: ¿cuándo elegir cada uno?