Contiguous memory, O(1) access, and the prefix sum trick that turns O(n) queries into O(1).
Click an operation to see it animated on the array.
Select a range [L, R] to compute sum in O(1) using prefix array.
| Operation | Time | Why |
|---|---|---|
arr[i] | O(1) | Direct address calculation |
arr.append(x) | O(1)* | Amortized (occasionally resizes) |
arr.pop() | O(1) | Remove last, no shifting |
arr.insert(i, x) | O(n) | Must shift all elements right |
arr.pop(i) | O(n) | Must shift all elements left |
x in arr | O(n) | Linear scan |
arr.sort() | O(n log n) | TimSort in-place |
# Difference array for range updates def range_update(arr, updates): n = len(arr) diff = [0] * (n + 1) for l, r, val in updates: diff[l] += val # add starts here diff[r + 1] -= val # subtract ends here # Apply prefix sum to get final array running = 0 for i in range(n): running += diff[i] arr[i] += running return arr
def build_prefix(arr): # prefix[i] = sum of arr[0..i-1] # prefix[0] = 0 (empty sum — sentinel) prefix = [0] * (len(arr) + 1) for i, x in enumerate(arr): prefix[i+1] = prefix[i] + x return prefix def range_sum(prefix, l, r): # Sum of arr[l..r] inclusive return prefix[r+1] - prefix[l] # Example: arr = [3, 1, 4, 1, 5, 9, 2] # pfx = [0, 3, 4, 8, 9,14,23,25] # sum(arr[2..5]) = pfx[6]-pfx[2] = 23-4 = 19 ✓
# Kadane's algorithm — Max subarray sum def max_subarray(nums): cur = best = nums[0] for n in nums[1:]: cur = max(n, cur + n) # extend or restart best = max(best, cur) return best # 2D prefix sum def build_2d_prefix(grid): R, C = len(grid), len(grid[0]) pre = [[0]*(C+1) for _ in range(R+1)] for r in range(1, R+1): for c in range(1, C+1): pre[r][c] = (grid[r-1][c-1] + pre[r-1][c] + pre[r][c-1] - pre[r-1][c-1]) return pre