AlgoViz
← Back to trail

Prefix Sums

Easy+70 XP

Precompute running totals once, then answer any range-sum in O(1) with a single subtraction.

No visualization loaded.

Watch

i

Press Run to begin.

A prefix sum is a running total. prefix[i] is the sum of everything in the array up to (but not including) position i — so prefix[0] = 0, prefix[1] = first value, prefix[2] = first two values added, and so on. Building that takes one quick pass. The payoff: once you have the running totals, the sum of ANY chunk of the array — say positions 2 through 5 — is just one subtraction: the running total at the end minus the running total before the start. No looping over the chunk; the answer pops out instantly.

What's a prefix sum?

It's the total of all the values from the start of the array up to a given spot. If the array is [3, 1, 4, 1], the prefix sums are 0, 3, 4, 8, 9 — each one is the previous running total plus the next value. We tuck a 0 at the front (the 'sum of nothing') so the range formula always works without a special case.

How does it make range-sum queries O(1)?

The sum of positions l through r equals prefix[r+1] - prefix[l]. Why? prefix[r+1] is 'everything up to and including r' and prefix[l] is 'everything before l'. Subtract, and the overlap cancels, leaving exactly the chunk in the middle. That's one subtraction — constant time — no matter how big the range is. Without prefix sums you'd add up the whole range each time, which is O(n) per query.

What's the setup cost?

One pass over the array to build the running totals — O(n) time and O(n) extra space for the prefix array. You pay that once. After that, every range-sum query is free-ish (O(1)). So it's a brilliant trade when you'll ask many range-sum questions: the setup cost is shared across all of them.

When do I reach for prefix sums?

Whenever you'll repeatedly ask 'what's the total between here and there?' — running balances, sub-array sums, image/area lookups (a 2D version exists too), or as a building block in harder problems. If you only ask once, a plain loop is fine. If you ask again and again, precompute prefix sums and turn each answer into a subtraction.

🧠Prefix sums = precompute running totals once (O(n)), then any range sum is prefix[r+1] - prefix[l] — a single O(1) subtraction. Trade O(n) space + setup for instant repeated range queries.
📈

How the work grows

input size n →work ↑
Time
O(n) build, O(1) per query
Space
O(n) — the prefix array

O(n) build, O(1) per query is fair — grows in step with the data. One pass builds the running totals (O(n)). After that each range-sum is a single subtraction (O(1)), no matter the range size — so the more queries you ask, the more that one-time setup pays off. The cost is O(n) extra space to store the prefix array.

Faint dotted lines = O(1) (flat) and O(n) (straight) for comparison.

prefix endpoint being read / writtenvalue added in / subtractedsettled total / the answer