Open In App

Count and Toggle Queries on a Binary Array

Last Updated : 27 Apr, 2023
Comments
Improve
Suggest changes
5 Likes
Like
Report

Given a size n in which initially all elements are 0. The task is to perform multiple queries of following two types. The queries can appear in any order. 
 

1. toggle(start, end) : Toggle (0 into 1 or 1 into 0) the values from range 'start' to 'end'.

2. count(start, end) : Count the number of 1's within given range from 'start' to 'end'.

Input : n = 5       // we have n = 5 blocks
        toggle 1 2  // change 1 into 0 or 0 into 1
        Toggle 2 4
        Count  2 3  // count all 1's within the range
        Toggle 2 4
        Count  1 4  // count all 1's within the range
Output : Total number of 1's in range 2 to 3 is = 1
         Total number of 1's in range 1 to 4 is = 2


 


A simple solutionfor this problem is to traverse the complete range for "Toggle" query and when you get "Count" query then count all the 1's for given range. But the time complexity for this approach will be O(q*n) where q=total number of queries.
An efficient solution for this problem is to use Segment Tree with Lazy Propagation. Here we collect the updates until we get a query for "Count". When we get the query for "Count", we make all the previously collected Toggle updates in array and then count number of 1's with in the given range. 
Below is the implementation of above approach:
 

C++
Java Python3 C# JavaScript

Output:  

1
2

The time complexity of the given program is O(log n) for both toggle() and countQuery() functions.

The space complexity of the program is O(n).
 


Next Article

Similar Reads