Open In App

Sum of even values and update queries on an array

Given an array arr[] of integers and an array q[] of queries. 
For the ith query, index = q[i][0] and value = q[i][1]. The task is for every query, update arr[index] = arr[index] + value and then return the sum of all the even elements from the array.

Examples: 

Input: arr[] = {1, 2, 3, 4}, q[] = {{0, 1}, {1, -3}, {0, -4}, {3, 2}} 
Output: 8 6 2 4 
At the beginning, the array is {1, 2, 3, 4}. 
After adding 1 to arr[0], the array becomes {2, 2, 3, 4} and the sum of even values is 2 + 2 + 4 = 8. 
Add -3 to arr[1], arr[] = {2, -1, 3, 4} and the sum of even values is 2 + 4 = 6. 
Add -4 to arr[0], arr[] = {-2, -1, 3, 4} and the sum of even values is -2 + 4 = 2. 
Adding 2 to arr[3], arr[] = {-2, -1, 3, 6} and the sum of even values is -2 + 6 = 4.

Input: arr[] = {1, 2, 2, 2}, q[] = {{0, 1}, {1, 1}} 
Output: 8 6  

Naive Approach: For each query, update the value in the array and calculate the sum of all even values from the array.

Below is the implementation of the above approach:  




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the sum of even elements
// after updating value at given index
int EvenSum(vector<int>& A, int index, int value)
{
    // Add given value to A[index]
    A[index] = A[index] + value;
 
    // To store the sum of even elements
    int sum = 0;
 
    for (int i = 0; i < A.size(); i++)
 
        // If current element is even
        if (A[i] % 2 == 0)
            sum = sum + A[i];
 
    return sum;
}
 
// Function to print the result for every query
void BalanceArray(vector<int>& A, vector<vector<int> >& Q)
{
 
    // Resultant vector that stores
    // the result for every query
    vector<int> ANS;
 
    int i, sum;
 
    for (i = 0; i < Q.size(); i++) {
 
        int index = Q[i][0];
        int value = Q[i][1];
 
        // Get sum of even elements after updating
        // value at given index
        sum = EvenSum(A, index, value);
 
        // Store sum for each query
        ANS.push_back(sum);
    }
 
    // Print the result for every query
    for (i = 0; i < ANS.size(); i++)
        cout << ANS[i] << " ";
}
 
// Driver code
int main()
{
    vector<int> A = { 1, 2, 3, 4 };
    vector<vector<int> > Q = { { 0, 1 },
                               { 1, -3 },
                               { 0, -4 },
                               { 3, 2 } };
    BalanceArray(A, Q);
 
    return 0;
}




// Java implementation of the approach
class GFG
{
    // Function to return the sum of even elements
    // after updating value at given index
    static int EvenSum(int [] A, int index, int value)
    {
        // Add given value to A[index]
        A[index] = A[index] + value;
     
        // To store the sum of even elements
        int sum = 0;
     
        for (int i = 0; i < A.length; i++)
     
            // If current element is even
            if (A[i] % 2 == 0)
                sum = sum + A[i];
     
        return sum;
    }
     
    // Function to print the result for every query
    static void BalanceArray(int [] A, int [][] Q)
    {
     
        // Resultant vector that stores
        // the result for every query
        int [] ANS = new int[Q.length];
        int i, sum;
     
        for (i = 0; i < Q.length; i++)
        {
     
            int index = Q[i][0];
            int value = Q[i][1];
     
            // Get sum of even elements after updating
            // value at given index
            sum = EvenSum(A, index, value);
     
            // Store sum for each query
            ANS[i] = sum;
        }
     
        // Print the result for every query
        for (i = 0; i < ANS.length; i++)
            System.out.print(ANS[i] + " ");
    }
     
    // Driver code
    public static void main(String []args)
    {
        int [] A = { 1, 2, 3, 4 };
        int [][] Q = { { 0, 1 },
                        { 1, -3 },
                        { 0, -4 },
                        { 3, 2 } };
        BalanceArray(A, Q);
     
    }
}
 
// This code is contributed by ihritik




# Python3 implementation of the approach
 
# Function to return the sum of even elements
# after updating value at given index
def EvenSum(A, index, value):
     
    # Add given value to A[index]
    A[index] = A[index] + value
 
    # To store the sum of even elements
    sum = 0
 
    for i in A:
 
        # If current element is even
        if (i % 2 == 0):
            sum = sum + i
 
    return sum
 
# Function to print result for every query
def BalanceArray(A,Q):
 
    # Resultant vector that stores
    # the result for every query
    ANS = []
 
    i, sum = 0, 0
 
    for i in range(len(Q)):
 
        index = Q[i][0]
        value = Q[i][1]
 
        # Get sum of even elements after updating
        # value at given index
        sum = EvenSum(A, index, value)
 
        # Store sum for each query
        ANS.append(sum)
 
    # Print the result for every query
    for i in ANS:
        print(i, end = " ")
 
# Driver code
A = [1, 2, 3, 4]
Q = [ [0, 1 ],
    [1, -3],
    [0, -4],
    [3, 2 ] ]
BalanceArray(A, Q)
 
# This code is contributed by mohit kumar 29




// C# implementation of the approach
using System;
public class GFG
{
 
  // Function to return the sum of even elements
  // after updating value at given index
  static int EvenSum(int[] A, int index, int value)
  {
 
    // Add given value to A[index]
    A[index] = A[index] + value;
 
    // To store the sum of even elements
    int sum = 0;
 
    for (int i = 0; i < A.Length; i++)
 
      // If current element is even
      if (A[i] % 2 == 0)
        sum = sum + A[i];
 
    return sum;
  }
 
  // Function to print the result for every query
  static void BalanceArray(int[] A, int[,] Q) {
 
    // Resultant vector that stores
    // the result for every query
    int[] ANS = new int[Q.GetLength(0)];
    int i, sum;
 
    for (i = 0; i < Q.GetLength(0); i++) {
 
      int index = Q[i,0];
      int value = Q[i,1];
 
      // Get sum of even elements after updating
      // value at given index
      sum = EvenSum(A, index, value);
 
      // Store sum for each query
      ANS[i] = sum;
    }
 
    // Print the result for every query
    for (i = 0; i < ANS.Length; i++)
      Console.Write(ANS[i] + " ");
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int[] A = { 1, 2, 3, 4 };
    int[,] Q = { { 0, 1 }, { 1, -3 }, { 0, -4 }, { 3, 2 } };
    BalanceArray(A, Q);
  }
}
 
// This code is contributed by Rajput-Ji.




<script>
 
 
// JavaScript implementation of the approach
 
// Function to return the sum of even elements
// after updating value at given index
function EvenSum(A, index, value)
{
    // Add given value to A[index]
    A[index] = A[index] + value;
 
    // To store the sum of even elements
    var sum = 0;
 
    for (var i = 0; i < A.length; i++)
 
        // If current element is even
        if (A[i] % 2 == 0)
            sum = sum + A[i];
 
    return sum;
}
 
// Function to print the result for every query
function BalanceArray(A, Q)
{
 
    // Resultant vector that stores
    // the result for every query
    var ANS = [];
 
    var i, sum;
 
    for (i = 0; i < Q.length; i++) {
 
        var index = Q[i][0];
        var value = Q[i][1];
 
        // Get sum of even elements after updating
        // value at given index
        sum = EvenSum(A, index, value);
 
        // Store sum for each query
        ANS.push(sum);
    }
 
    // Print the result for every query
    for (i = 0; i < ANS.length; i++)
        document.write( ANS[i] + " ");
}
 
// Driver code
var A = [ 1, 2, 3, 4 ];
var Q = [ [ 0, 1 ],
          [ 1, -3 ],
          [ 0, -4 ],
          [ 3, 2 ] ];
BalanceArray(A, Q);
 
</script>

Output: 
8 6 2 4

 

Time Complexity: O(n2)

Auxiliary Space: O(n)

Efficient Approach: 

Below is the implementation of the above approach:  




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the result for every query
void BalanceArray(vector<int>& A, vector<vector<int> >& Q)
{
    vector<int> ANS;
 
    int i, sum = 0;
 
    for (i = 0; i < A.size(); i++)
 
        // If current element is even
        if (A[i] % 2 == 0)
            sum = sum + A[i];
 
    for (i = 0; i < Q.size(); i++) {
 
        int index = Q[i][0];
        int value = Q[i][1];
 
        // If element is even then
        // remove it from sum
        if (A[index] % 2 == 0)
            sum = sum - A[index];
 
        A[index] = A[index] + value;
 
        // If the value becomes even after updating
        if (A[index] % 2 == 0)
            sum = sum + A[index];
 
        // Store sum for each query
        ANS.push_back(sum);
    }
 
    // Print the result for every query
    for (i = 0; i < ANS.size(); i++)
        cout << ANS[i] << " ";
}
 
// Driver code
int main()
{
    vector<int> A = { 1, 2, 3, 4 };
    vector<vector<int> > Q = { { 0, 1 },
                               { 1, -3 },
                               { 0, -4 },
                               { 3, 2 } };
    BalanceArray(A, Q);
 
    return 0;
}




// Java implementation of the approach
class GFG
{
    // Function to print the result for every query
    static void BalanceArray(int [] A, int [][] Q)
    {
        int [] ANS = new int [A.length];
     
        int i, sum = 0;
     
        for (i = 0; i < A.length; i++)
     
            // If current element is even
            if (A[i] % 2 == 0)
                sum = sum + A[i];
     
        for (i = 0; i < Q.length; i++)
        {
     
            int index = Q[i][0];
            int value = Q[i][1];
     
            // If element is even then
            // remove it from sum
            if (A[index] % 2 == 0)
                sum = sum - A[index];
     
            A[index] = A[index] + value;
     
            // If the value becomes even after updating
            if (A[index] % 2 == 0)
                sum = sum + A[index];
     
            // Store sum for each query
            ANS[i]= sum;
        }
     
        // Print the result for every query
        for (i = 0; i < ANS.length; i++)
            System.out.print(ANS[i] + " ");
    }
     
    // Driver code
    public static void main(String [] args)
    {
        int [] A = { 1, 2, 3, 4 };
        int [][] Q = { { 0, 1 },
                                { 1, -3 },
                                { 0, -4 },
                                { 3, 2 } };
        BalanceArray(A, Q);
    }
}
 
// This code is contributed by ihritik




# Python3 implementation of the approach
 
# Function to print the result for
# every query
def BalanceArray(A, Q) :
     
    ANS = []
    sum = 0
 
    for i in range(len(A)) :
 
        # If current element is even
        if (A[i] % 2 == 0) :
            sum += A[i];
 
    for i in range(len(Q)) :
 
        index = Q[i][0];
        value = Q[i][1];
 
        # If element is even then
        # remove it from sum
        if (A[index] % 2 == 0) :
            sum -= A[index];
 
        A[index] += value;
 
        # If the value becomes even
        # after updating
        if (A[index] % 2 == 0) :
            sum += A[index];
 
        # Store sum for each query
        ANS.append(sum);
     
 
    # Print the result for every query
    for i in range(len(ANS)) :
        print(ANS[i], end = " ");
 
# Driver code
if __name__ == "__main__" :
 
    A = [ 1, 2, 3, 4 ];
    Q = [ [ 0, 1 ], [ 1, -3 ],
          [ 0, -4 ], [ 3, 2 ]];
    BalanceArray(A, Q);
 
# This code is contributed by Ryuga




// C# implementation of the approach
using System;
 
class GFG
{
    // Function to print the result for every query
    static void BalanceArray(int [] A, int [, ] Q)
    {
        int [] ANS = new int [A.Length];
     
        int i, sum = 0;
     
        for (i = 0; i < A.Length; i++)
     
            // If current element is even
            if (A[i] % 2 == 0)
                sum = sum + A[i];
     
        for (i = 0; i < Q.GetLength(0); i++)
        {
     
            int index = Q[i, 0];
            int value = Q[i, 1];
     
            // If element is even then
            // remove it from sum
            if (A[index] % 2 == 0)
                sum = sum - A[index];
     
            A[index] = A[index] + value;
     
            // If the value becomes even after updating
            if (A[index] % 2 == 0)
                sum = sum + A[index];
     
            // Store sum for each query
            ANS[i]= sum;
        }
     
        // Print the result for every query
        for (i = 0; i < ANS.Length; i++)
            Console.Write(ANS[i] + " ");
    }
     
    // Driver code
    public static void Main()
    {
        int [] A = { 1, 2, 3, 4 };
        int [, ] Q = { { 0, 1 },
                                { 1, -3 },
                                { 0, -4 },
                                { 3, 2 } };
        BalanceArray(A, Q);
    }
}
 
// This code is contributed by ihritik




<?php
// PHP implementation of the approach
 
// Function to print the result for every query
function BalanceArray($A, &$Q)
{
    $ANS = array();
 
    $sum = 0;
 
    for ($i = 0; $i < count($A); $i++)
 
        // If current element is even
        if ($A[$i] % 2 == 0)
            $sum = $sum + $A[$i];
 
    for ($i = 0; $i < count($Q); $i++)
    {
        $index = $Q[$i][0];
        $value = $Q[$i][1];
 
        // If element is even then
        // remove it from sum
        if ($A[$index] % 2 == 0)
            $sum = $sum - $A[$index];
 
        $A[$index] = $A[$index] + $value;
 
        // If the value becomes even after updating
        if ($A[$index] % 2 == 0)
            $sum = $sum + $A[$index];
 
        // Store sum for each query
        array_push($ANS,$sum);
    }
 
    // Print the result for every query
    for ($i = 0; $i < count($ANS); $i++)
        echo $ANS[$i] . " ";
}
 
// Driver code
$A = array( 1, 2, 3, 4 );
$Q = array(array( 0, 1 ),
           array( 1, -3 ),
           array( 0, -4 ),
           array( 3, 2 ));
BalanceArray($A, $Q);
 
// This code is contributed by chandan_jnu
?>




<script>
 
// JavaScript implementation of the approach
 
// Function to print the result for every query
function BalanceArray(A, Q)
{
    var ANS = [];
 
    var i, sum = 0;
 
    for (i = 0; i < A.length; i++)
 
        // If current element is even
        if (A[i] % 2 == 0)
            sum = sum + A[i];
 
    for (i = 0; i < Q.length; i++) {
 
        var index = Q[i][0];
        var value = Q[i][1];
 
        // If element is even then
        // remove it from sum
        if (A[index] % 2 == 0)
            sum = sum - A[index];
 
        A[index] = A[index] + value;
 
        // If the value becomes even after updating
        if (A[index] % 2 == 0)
            sum = sum + A[index];
 
        // Store sum for each query
        ANS.push(sum);
    }
 
    // Print the result for every query
    for (i = 0; i < ANS.length; i++)
        document.write( ANS[i] + " ");
}
 
// Driver code
var A = [ 1, 2, 3, 4 ];
var Q = [ [ 0, 1 ],
         [ 1, -3 ],
         [ 0, -4 ],
          [ 3, 2 ] ];
BalanceArray(A, Q);
 
</script>

Output: 
8 6 2 4

 

Time Complexity: O(n)
 Auxiliary Space: O(n)


Article Tags :