Given N numbers and Q queries, every query consists of L and R, task is to find the number of such integers i (L<=i<R) such that Ai=Ai+1. Consider 0-based indexing.
Examples :
Input : A = [1, 2, 2, 2, 3, 3, 4, 4, 4]
Q = 2
L = 1 R = 8
L = 0 R = 4
Output : 5
2
Explanation: We have 5 index i which has
Ai=Ai+1 in range [1, 8). We have
2 indexes i which have Ai=Ai+1
in range [0, 4).
Input :A = [3, 3, 4, 4]
Q = 2
L = 0 R = 3
L = 2 R = 3
Output : 2
1
A naive approach is to traverse from L to R (Exclusive R) and count the number of index i which satisfies the condition Ai=Ai+1 for every query separately.
Below is the implementation of the naive approach :
C++
#include <bits/stdc++.h>
using namespace std;
int answer_query( int a[], int n, int l, int r)
{
int count = 0;
for ( int i = l; i < r; i++)
if (a[i] == a[i + 1])
count += 1;
return count;
}
int main()
{
int a[] = { 1, 2, 2, 2, 3, 3, 4, 4, 4 };
int n = sizeof (a) / sizeof (a[0]);
int L, R;
L = 1;
R = 8;
cout << answer_query(a, n, L, R) << endl;
L = 0;
R = 4;
cout << answer_query(a, n, L, R) << endl;
return 0;
}
|
Java
class GFG {
static int answer_query( int a[], int n,
int l, int r)
{
int count = 0 ;
for ( int i = l; i < r; i++)
if (a[i] == a[i + 1 ])
count += 1 ;
return count;
}
public static void main(String[] args)
{
int a[] = { 1 , 2 , 2 , 2 , 3 , 3 , 4 , 4 , 4 };
int n = a.length;
int L, R;
L = 1 ;
R = 8 ;
System.out.println(
answer_query(a, n, L, R));
L = 0 ;
R = 4 ;
System.out.println(
answer_query(a, n, L, R));
}
}
|
Python 3
def answer_query(a, n, l, r):
count = 0
for i in range (l, r):
if (a[i] = = a[i + 1 ]):
count + = 1
return count
a = [ 1 , 2 , 2 , 2 , 3 , 3 , 4 , 4 , 4 ]
n = len (a)
L = 1
R = 8
print (answer_query(a, n, L, R))
L = 0
R = 4
print (answer_query(a, n, L, R))
|
C#
using System;
class GFG {
static int answer_query( int []a, int n,
int l, int r)
{
int count = 0;
for ( int i = l; i < r; i++)
if (a[i] == a[i + 1])
count += 1;
return count;
}
public static void Main()
{
int []a = {1, 2, 2, 2, 3, 3,
4, 4, 4};
int n = a.Length;
int L, R;
L = 1;
R = 8;
Console.WriteLine(
answer_query(a, n, L, R));
L = 0;
R = 4;
Console.WriteLine(
answer_query(a, n, L, R));
}
}
|
PHP
<?php
function answer_query( $a , $n ,
$l , $r )
{
$count = 0;
for ( $i = $l ; $i < $r ; $i ++)
if ( $a [ $i ] == $a [ $i + 1])
$count += 1;
return $count ;
}
$a = array (1, 2, 2, 2, 3,
3, 4, 4, 4 );
$n = count ( $a );
$L = 1;
$R = 8;
echo (answer_query( $a , $n ,
$L , $R ). "\n" );
$L = 0;
$R = 4;
echo (answer_query( $a , $n ,
$L , $R ). "\n" );
?>
|
Javascript
<script>
function answer_query(a, n, l, r)
{
var count = 0;
for ( var i = l; i < r; i++)
if (a[i] == a[i + 1])
count += 1;
return count;
}
var a = [1, 2, 2, 2, 3, 3, 4, 4, 4]
var n = a.length;
var L, R;
L = 1;
R = 8;
document.write(answer_query(a, n, L, R) + "<br>" );
L = 0;
R = 4;
document.write(answer_query(a, n, L, R));
</script>
|
Time Complexity : O(R – L) for every query
Auxiliary Space: O(1)
Efficient approach: We can answer queries in O(1) time. The idea is to precompute a prefix array prefixans such that prefixans[i] stores the total count of the index from 0 to i that obeys the given condition. prefixans[R-1]-prefix[L-1] returns the total count of an index in the range [L, r) for every query.
Below is the implementation of the efficient approach :
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int prefixans[N];
int countIndex( int a[], int n)
{
for ( int i = 0; i < n; i++) {
if (a[i] == a[i + 1])
prefixans[i] = 1;
if (i != 0)
prefixans[i] += prefixans[i - 1];
}
}
int answer_query( int l, int r)
{
if (l == 0)
return prefixans[r - 1];
else
return prefixans[r - 1] - prefixans[l - 1];
}
int main()
{
int a[] = { 1, 2, 2, 2, 3, 3, 4, 4, 4 };
int n = sizeof (a) / sizeof (a[0]);
countIndex(a, n);
int L, R;
L = 1;
R = 8;
cout << answer_query(L, R) << endl;
L = 0;
R = 4;
cout << answer_query(L, R) << endl;
return 0;
}
|
Java
class GFG {
public static int N = 1000 ;
static int prefixans[] = new int [ 1000 ];
public static void countIndex( int a[], int n)
{
for ( int i = 0 ; i < n; i++) {
if (i + 1 < n && a[i] == a[i + 1 ])
prefixans[i] = 1 ;
if (i != 0 )
prefixans[i] += prefixans[i - 1 ];
}
}
public static int answer_query( int l, int r)
{
if (l == 0 )
return prefixans[r - 1 ];
else
return prefixans[r - 1 ] -
prefixans[l - 1 ];
}
public static void main(String args[])
{
int a[] = { 1 , 2 , 2 , 2 , 3 , 3 , 4 , 4 , 4 };
int n = 9 ;
countIndex(a, n);
int L, R;
L = 1 ;
R = 8 ;
System.out.println(answer_query(L, R));
L = 0 ;
R = 4 ;
System.out.println(answer_query(L, R));
}
}
|
Python3
N = 1000
prefixans = [ 0 ] * N;
def countIndex(a, n) :
global N, prefixans
for i in range ( 0 , n - 1 ) :
if (a[i] = = a[i + 1 ]) :
prefixans[i] = 1
if (i ! = 0 ) :
prefixans[i] = (prefixans[i] +
prefixans[i - 1 ])
def answer_query(l, r) :
global N, prefixans
if (l = = 0 ) :
return prefixans[r - 1 ]
else :
return (prefixans[r - 1 ] -
prefixans[l - 1 ])
a = [ 1 , 2 , 2 , 2 ,
3 , 3 , 4 , 4 , 4 ]
n = len (a)
countIndex(a, n)
L = 1
R = 8
print (answer_query(L, R))
L = 0
R = 4
print (answer_query(L, R))
|
C#
using System;
class GFG
{
static int N = 1000;
static int []prefixans = new int [N];
static void countIndex( int []a,
int n)
{
for ( int i = 0; i < n - 1; i++)
{
if (a[i] == a[i + 1])
prefixans[i] = 1;
if (i != 0)
prefixans[i] += prefixans[i - 1];
}
}
static int answer_query( int l, int r)
{
if (l == 0)
return prefixans[r - 1];
else
return prefixans[r - 1] -
prefixans[l - 1];
}
static void Main()
{
int []a = new int []{1, 2, 2, 2,
3, 3, 4, 4, 4};
int n = a.Length;
countIndex(a, n);
int L, R;
L = 1;
R = 8;
Console.WriteLine(answer_query(L, R));
L = 0;
R = 4;
Console.WriteLine(answer_query(L, R));
}
}
|
PHP
<?php
$N = 1000;
$prefixans = array_fill (0, $N , 0);
function countIndex( $a , $n )
{
global $N , $prefixans ;
for ( $i = 0; $i < $n - 1; $i ++)
{
if ( $a [ $i ] == $a [ $i + 1])
$prefixans [ $i ] = 1;
if ( $i != 0)
$prefixans [ $i ] +=
$prefixans [ $i - 1];
}
}
function answer_query( $l , $r )
{
global $N , $prefixans ;
if ( $l == 0)
return $prefixans [ $r - 1];
else
return ( $prefixans [ $r - 1] -
$prefixans [ $l - 1]);
}
$a = array (1, 2, 2, 2,
3, 3, 4, 4, 4);
$n = count ( $a );
countIndex( $a , $n );
$L = 1;
$R = 8;
echo (answer_query( $L , $R ) . "\n" );
$L = 0;
$R = 4;
echo (answer_query( $L , $R ). "\n" );
?>
|
Javascript
<script>
const N = 1000;
let prefixans = new Uint8Array(N);
function countIndex(a, n)
{
for (let i = 0; i < n; i++) {
if (a[i] == a[i + 1])
prefixans[i] = 1;
if (i != 0)
prefixans[i] += prefixans[i - 1];
}
}
function answer_query(l, r)
{
if (l == 0)
return prefixans[r - 1];
else
return prefixans[r - 1] - prefixans[l - 1];
}
let a = [ 1, 2, 2, 2, 3, 3, 4, 4, 4 ];
let n = a.length;
countIndex(a, n);
let L, R;
L = 1;
R = 8;
document.write(answer_query(L, R) + "<br>" );
L = 0;
R = 4;
document.write(answer_query(L, R) + "<br>" );
</script>
|
Time complexity: O(n)
Auxiliary Space: O(n)