# Prefix Sum in Java
[TOC]
## Types
given `nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };`
1. prefix sum starting from `nums[0]`, with `prefixSum.length = nums.length`.
>`prefixSum = { 1, 3, 6, 10, 15, 21, 28, 36, 45 };`
2. prefix sum starting from `0`, with `prefixSum.length = nums.length + 1`.
>`prefixSum = { 0, 1, 3, 6, 10, 15, 21, 28, 36, 45 };`
## How to write (type1 as examples)
### 1. Using iteration
```java=
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] prefixSum = new int[nums.length];
prefixSum[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
prefixSum[i] = prefixSum[i - 1] + nums[i];
}
```
### 2. Using Arrays.setAll
```java=
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] prefixSum = new int[nums.length];
Arrays.setAll(prefixSum, i -> i == 0 ? nums[0] : prefixSum[i - 1] + nums[i]);
```
### 3. Using Arrays.parallelPrefix
```java=
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] prefixSum = Arrays.copyOf(nums, nums.length);
Arrays.parallelPrefix(prefixSum, (x, y) -> x + y);
```
## Usage
### Interval Sum
```java=
prefixSum[j] - prefixSum[i];
// = sum of [i,j)
```
### Overlapped Intervals
Given a set of intervals `int[][] intervals`, where each interval is represented as `{ start, end, value }`, add value to all elements in the range `arr[start] to arr[end - 1]`.
Return an array `arr`, where `arr[i]` represents the accumulated sum of values at index i.
```java=
for (int[] interval : intervals) {
int start = interval[0];
int end = interval[1];
int value = interval[2];
arr[start] += value;
arr[end] -= value;
}
// after prefix sum, we get the answer
for (int i = 1; i < arr.length; i++) {
arr[i] += arr[i - 1];
}
```