Range Queries for finding the Sum of all even parity numbers

Given Q queries where each query consists of two numbers L and R which denotes a range [L, R]. The task is to find the sum of all Even Parity Numbers lying in the given range [L, R].

Parity of a number refers to whether it contains an odd or even number of 1-bits. The number has Even Parity if it contains even number of 1-bits.

Examples:

Input: Q = [ [1, 10], [121, 211] ]
Output:
33
7493
Explanation:
binary(1) = 01, parity = 1
binary(2) = 10, parity = 1
binary(3) = 11, parity = 2
binary(4) = 100, parity = 1
binary(5) = 101, parity = 2
binary(6) = 110, parity = 2
binary(7) = 111, parity = 3
binary(8) = 1000, parity = 1
binary(9) = 1001, parity = 2
binary(10) = 1010, parity = 2
From 1 to 10, 3, 5, 6, 9 and 10 are the Even Parity numbers. Therefore the sum is 33.
From 121 to 211 the sum of all the even parity numbers is 7493.

Input: Q = [ [ 10, 10 ], [ 258, 785 ], [45, 245], [ 1, 1000]]
Output:
10
137676
14595
250750



Approach:
The idea is to use a Prefix Sum Array. The sum of all Even Parity Numbers till that particular index is precomputed and stored in an array pref[] so that every query can be answered in O(1) time.

  1. Initialise the prefix array pref[].
  2. Iterate from 1 to N and check if the number has even parity or not:
    • If the number is Even Parity Number then, the current index of pref[] will store the sum of Even Parity Numbers found so far.
    • Else the current index of pref[] is same as the value at previous index of pref[].
  3. For Q queries the sum of all Even Parity Numbers for range [L, R] can be calculated as follows:
    sum = pref[R] - pref[L - 1]
    

Below is the implementation of the above approach

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the sum
// of all Even Parity numbers
// in the given range
  
#include <bits/stdc++.h>
using namespace std;
  
// pref[] array to precompute
// the sum of all Even
// Parity Numbers
int pref[100001] = { 0 };
  
// Function that returns true
// if count of set bits in
// x is even
int isEvenParity(int num)
{
    // Parity will store the
    // count of set bits
    int parity = 0;
    int x = num;
    while (x != 0) {
        if (x & 1)
            parity++;
        x = x >> 1;
    }
  
    if (parity % 2 == 0)
        return num;
    else
        return 0;
}
  
// Function to precompute the
// sum of all even parity
// numbers upto 100000
void preCompute()
{
    for (int i = 1; i < 100001; i++) {
  
        // isEvenParity()
        // return the number i
        // if i has even parity
        // else return 0
        pref[i] = pref[i - 1]
                  + isEvenParity(i);
    }
}
  
// Function to print sum
// for each query
void printSum(int L, int R)
{
    cout << (pref[R] - pref[L - 1])
         << endl;
}
  
// Function to print sum of all
// even parity numbers between
// [L, R]
void printSum(int arr[2][2], int Q)
{
  
    // Function that pre computes
    // the sum of all even parity
    // numbers
    preCompute();
  
    // Iterate over all Queries
    // to print sum
    for (int i = 0; i < Q; i++) {
        printSum(arr[i][0],
                 arr[i][1]);
    }
}
// Driver code
int main()
{
    // Queries
    int N = 2;
    int Q[2][2] = { { 1, 10 },
                    { 121, 211 } };
  
    // Function that print
    // the sum of all even parity
    // numbers in Range [L, R]
    printSum(Q, N);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the sum
// of all Even Parity numbers
// in the given range
import java.io.*; 
import java.util.*; 
  
class GFG { 
      
// pref[] array to precompute
// the sum of all Even
// Parity Numbers
static int[] pref = new int[100001];
  
// Function that returns true
// if count of set bits in
// x is even
static int isEvenParity(int num)
{
      
    // Parity will store the
    // count of set bits
    int parity = 0;
    int x = num;
      
    while (x != 0)
    {
        if ((x & 1) == 1)
            parity++;
              
        x = x >> 1;
    }
      
    if (parity % 2 == 0)
        return num;
    else
        return 0;
}
  
// Function to precompute the
// sum of all even parity
// numbers upto 100000
static void preCompute()
{
    for(int i = 1; i < 100001; i++)
    {
  
       // isEvenParity()
       // return the number i
       // if i has even parity
       // else return 0
       pref[i] = pref[i - 1] + isEvenParity(i);
    }
}
  
// Function to print sum
// for each query
static void printSum(int L, int R)
{
    System.out.println(pref[R] - pref[L - 1]);
}
  
// Function to print sum of all
// even parity numbers between
// [L, R]
static void printSum(int arr[][], int Q)
{
      
    // Function that pre computes
    // the sum of all even parity
    // numbers
    preCompute();
  
    // Iterate over all Queries
    // to print sum
    for(int i = 0; i < Q; i++) 
    {
       printSum(arr[i][0], arr[i][1]);
    }
}
      
// Driver code 
public static void main(String[] args) 
      
    // Queries
    int N = 2;
    int[][] Q = { { 1, 10 }, 
                  { 121, 211 } };
  
    // Function that print
    // the sum of all even parity
    // numbers in Range [L, R]
    printSum(Q, N);
}
  
// This code is contributed by coder001

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the sum
// of all Even Parity numbers
// in the given range
using System;
  
class GFG { 
      
// pref[] array to precompute
// the sum of all Even
// Parity Numbers
static int[] pref = new int[100001];
  
// Function that returns true
// if count of set bits in
// x is even
static int isEvenParity(int num)
{
      
    // Parity will store the
    // count of set bits
    int parity = 0;
    int x = num;
      
    while (x != 0)
    {
        if ((x & 1) == 1)
            parity++;
              
        x = x >> 1;
    }
      
    if (parity % 2 == 0)
        return num;
    else
        return 0;
}
  
// Function to precompute the
// sum of all even parity
// numbers upto 100000
static void preCompute()
{
    for(int i = 1; i < 100001; i++)
    {
          
       // isEvenParity()
       // return the number i
       // if i has even parity
       // else return 0
       pref[i] = pref[i - 1] + isEvenParity(i);
    }
}
  
// Function to print sum
// for each query
static void printSum(int L, int R)
{
    Console.WriteLine(pref[R] - pref[L - 1]);
}
  
// Function to print sum of all
// even parity numbers between
// [L, R]
static void printSum(int[,] arr, int Q)
{
      
    // Function that pre computes
    // the sum of all even parity
    // numbers
    preCompute();
  
    // Iterate over all Queries
    // to print sum
    for(int i = 0; i < Q; i++) 
    {
       printSum(arr[i, 0], arr[i, 1]);
    }
}
      
// Driver code 
public static void Main() 
      
    // Queries
    int N = 2;
    int[,] Q = { { 1, 10 }, 
                 { 121, 211 } };
  
    // Function that print
    // the sum of all even parity
    // numbers in Range [L, R]
    printSum(Q, N);
}
  
// This code is contributed by AbhiThakur

chevron_right


Output:

33
7493

Time Complexity: O(N), where N is the maximum element in the query.

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : coder001, abhaysingh290895