TOPIC: Fenwick Tree (Binary Indexed Tree) DEFINITION: A Fenwick Tree, also known as a Binary Indexed Tree, is a data structure used to efficiently calculate prefix sums and update elements in an array. It solves the problem of quickly computing cumulative sums and making range updates by using a tree-like structure to store the cumulative sums. TIME_COMPLEXITY: The time complexity of a Fenwick Tree is O(log n) for both update and query operations, where n is the number of elements in the array, because each operation involves traversing a path in the tree that is at most log n levels deep. SPACE_COMPLEXITY: The space complexity of a Fenwick Tree is O(n), as it requires an array of size n to store the tree nodes, with each node representing a cumulative sum. USE_WHEN: Use a Fenwick Tree when you need to frequently calculate prefix sums or make range updates in an array, such as in scenarios involving dynamic cumulative sum calculations or updates to a large dataset. This data structure is particularly useful when the array is too large to fit into memory or when updates and queries need to be performed quickly. AVOID_WHEN: Avoid using a Fenwick Tree when the array is relatively small or when random access to individual elements is necessary, as the overhead of the tree structure may outweigh its benefits; in such cases, a simple array or a hash table may be a better choice. EXAMPLE: Suppose we have an array [3, 2, -1, 6, 5] and we want to calculate the prefix sum up to the 4th index using a Fenwick Tree: Initial array: [3, 2, -1, 6, 5] Initialize tree: [3, 5, 4, 10, 15] To calculate prefix sum up to 4th index: Start at index 4 (value 15) Subtract value at index 3 (value 10): 15 - 10 = 5 Add value at index 2 (value 4): 5 + 4 = 9 Subtract value at index 1 (value 5): 9 - 5 = 4 Add value at index 0 (value 3): 4 + 3 = 7 Result: Checkmark: The prefix sum up to the 4th index is 15. REAL_WORLD_ANALOGY: A Fenwick Tree can be thought of as a hierarchical accounting system, where each node in the tree represents a cumulative sum of a subset of accounts, allowing for efficient calculation of totals and updates to individual accounts. SOURCE_NOTE: Concepts referenced from general knowledge of data structures and algorithms.