Hackerrank - Array Manipulation Solution

# Hackerrank - Array Manipulation Solution Starting with a 1-indexed array of zeros and a list of operations, for each operation add a value to each of the array element between two given indices, inclusive. Once all operations have been performed, return the maximum value in your array.

For example, the length of your array of zeros . Your list of queries is as follows:

a b k
1 5 3
4 8 7
6 9 1

Add the values of  between the indices  and  inclusive:

index->	 1 2 3  4  5 6 7 8 9 10
[0,0,0, 0, 0,0,0,0,0, 0]
[3,3,3, 3, 3,0,0,0,0, 0]
[3,3,3,10,10,7,7,7,0, 0]
[3,3,3,10,10,8,8,8,1, 0]

The largest value is  after all operations are performed.

Function Description

Complete the function arrayManipulation in the editor below. It must return an integer, the maximum value in the resulting array.

arrayManipulation has the following parameters:

• n - the number of elements in your array
• queries - a two dimensional array of queries where each queries[i] contains three integers, a, b, and k.

Input Format

The first line contains two space-separated integers  and , the size of the array and the number of operations.
Each of the next  lines contains three space-separated integers ,  and , the left index, right index and summand.

Constraints

Output Format

Return the integer maximum value in the finished array.

Sample Input

5 3
1 2 100
2 5 100
3 4 100


Sample Output

200


Explanation

After the first update list will be 100 100 0 0 0.
After the second update list will be 100 200 100 100 100.
After the third update list will be 100 200 200 200 100.
The required answer will be .

### Solution in Python

from collections import Counter

def arrayManipulation(n, queries):
c = Counter()
for a,b,k in queries:
c[a]  +=k
c[b+1]-=k
arrSum = 0
maxSum = 0
for i in sorted(c)[:-1]:
arrSum+= c[i]
maxSum = max(maxSum,arrSum)
return maxSum

n,m = map(int,input().split())
queries = [list(map(int,input().split())) for _ in range(m)]
print(arrayManipulation(n, queries))

Explanation

• Given a range[a, b] and a value k we need to add k to all the numbers whose indices are in the range from [a, b].
• We can do an O(1) update by adding  to index a and add -k to index b+1.
• Doing this kind of update, the ith  number in the array will be prefix sum of array from index 1 to i because we are adding k to the value at index b+1 and subtracting  from the value at index  and taking prefix sum will give us the actual value for each index after m operations .
• So, we can do all m updates in O(m) time. Now we have to check the largest number in the original array. i.e. the index i such that prefix sum attains the maximum value.
• We can calculate all prefix sums as well as maximum prefix sum in O(n) time which will execute in time.
Editorial