Given an array of N integers and Q queries. Every query consists of L and R. The task is to print the second smallest element in range L-R. Print -1 if no second smallest element exists.
Examples:
Input:
a[] = {1, 2, 2, 4}
Queries= 2
L = 1, R = 2
L = 0, R = 1
Output:
-1
2
Approach: Process every query and print the second smallest using the following algorithm.
- Initialize both first and second smallest as INT_MAX
- Loop through all the elements.
- If the current element is smaller than the first, then update first and second.
- Else if the current element is smaller than the second then update second
If the second element is still INT_MAX after looping through all the elements, print -1 else print the second smallest element.
Below is the implementation of the above approach:
// C++ program for // SP - Second Smallest in Range #include <bits/stdc++.h> using namespace std;
// Function to find the second smallest element // in range L-R of an array int secondSmallest( int a[], int n, int l, int r)
{ int first = INT_MAX;
int second = INT_MAX;
for ( int i = l; i <= r; i++) {
if (a[i] < first) {
second = first;
first = a[i];
}
else if (a[i] < second and a[i] != first) {
second = a[i];
}
}
if (second == INT_MAX)
return -1;
else
return second;
} // function to perform queries void performQueries( int a[], int n)
{ // 1-st query
int l = 1;
int r = 2;
cout << secondSmallest(a, n, l, r) << endl;
// 2nd query
l = 0;
r = 1;
cout << secondSmallest(a, n, l, r);
} // Driver Code int main()
{ int a[] = { 1, 2, 2, 4 };
int n = sizeof (a) / sizeof (a[0]);
performQueries(a, n);
return 0;
} |
// Java program for // SP - Second Smallest in Range class GFG
{ // Function to find the // second smallest element // in range L-R of an array static int secondSmallest( int a[], int n,
int l, int r)
{ int first = Integer.MAX_VALUE;
int second = Integer.MAX_VALUE;
for ( int i = l; i <= r; i++)
{ if (a[i] < first)
{
second = first;
first = a[i];
}
else if (a[i] < second &&
a[i] != first)
{
second = a[i];
}
} if (second == Integer.MAX_VALUE)
return - 1 ;
else return second;
} // function to perform queries static void performQueries( int a[], int n)
{ // 1-st query
int l = 1 ;
int r = 2 ;
System.out.println(secondSmallest(a, n, l, r));
// 2nd query
l = 0 ;
r = 1 ;
System.out.println(secondSmallest(a, n, l, r));
} // Driver Code public static void main(String[] args)
{ int a[] = { 1 , 2 , 2 , 4 };
int n = a.length;
performQueries(a, n);
} } // This code is contributed // by ChitraNayal |
# Python program for # SP - Second Smallest in Range # Function to find the # second smallest element # in range L-R of an array import sys
def secondSmallest(a, n, l, r):
first = sys.maxsize
second = sys.maxsize
for i in range (l, r + 1 ):
if (a[i] < first):
second = first
first = a[i]
elif (a[i] < second and
a[i] ! = first):
second = a[i]
if (second = = sys.maxsize):
return - 1
else :
return second
# function to perform queries def performQueries(a, n):
# 1-st query
l = 1
r = 2
print (secondSmallest(a, n, l, r))
# 2nd query
l = 0
r = 1
print (secondSmallest(a, n, l, r))
# Driver Code a = [ 1 , 2 , 2 , 4 ]
n = len (a)
performQueries(a, n); # This code is contributed # by Shivi_Aggarwal |
// C# program for // SP - Second Smallest in Range using System;
class GFG
{ // Function to find the // second smallest element // in range L-R of an array static int secondSmallest( int [] a, int n,
int l, int r)
{ int first = int .MaxValue;
int second = int .MaxValue;
for ( int i = l; i <= r; i++)
{ if (a[i] < first)
{
second = first;
first = a[i];
}
else if (a[i] < second &&
a[i] != first)
{
second = a[i];
}
} if (second == int .MaxValue)
return -1;
else return second;
} // function to perform queries static void performQueries( int [] a, int n)
{ // 1-st query
int l = 1;
int r = 2;
Console.WriteLine(secondSmallest(a, n, l, r));
// 2nd query
l = 0;
r = 1;
Console.WriteLine(secondSmallest(a, n, l, r));
} // Driver Code public static void Main()
{ int [] a = { 1, 2, 2, 4 };
int n = a.Length;
performQueries(a, n);
} } // This code is contributed // by ChitraNayal |
<?php // PHP program for // SP - Second Smallest in Range // Function to find the // second smallest element // in range L-R of an array function secondSmallest(& $a , $n , $l , $r )
{ $first = PHP_INT_MAX;
$second = PHP_INT_MAX;
for ( $i = $l ; $i <= $r ; $i ++)
{
if ( $a [ $i ] < $first )
{
$second = $first ;
$first = $a [ $i ];
}
else if ( $a [ $i ] < $second and
$a [ $i ] != $first )
{
$second = $a [ $i ];
}
}
if ( $second == PHP_INT_MAX)
return -1;
else
return $second ;
} // function to perform queries function performQueries(& $a , $n )
{ // 1-st query
$l = 1;
$r = 2;
echo secondSmallest( $a , $n ,
$l , $r ). "\n" ;
// 2nd query
$l = 0;
$r = 1;
echo secondSmallest( $a , $n ,
$l , $r ). "\n" ;
} // Driver Code $a = array (1, 2, 2, 4);
$n = sizeof( $a );
performQueries( $a , $n );
// This code is contributed // by ChitraNayal ?> |
<script> // Javascript program for // SP - Second Smallest in Range // Function to find the // second smallest element // in range L-R of an array function secondSmallest(a,n,l,r)
{ let first = Number.MAX_VALUE; let second = Number.MAX_VALUE; for (let i = l; i <= r; i++)
{ if (a[i] < first)
{
second = first;
first = a[i];
}
else if (a[i] < second &&
a[i] != first)
{
second = a[i];
}
} if (second == Number.MAX_VALUE)
return -1;
else return second;
} // function to perform queries function performQueries(a,n)
{ // 1-st query
let l = 1;
let r = 2;
document.write(secondSmallest(a, n, l, r)+ "<br>" );
// 2nd query
l = 0;
r = 1;
document.write(secondSmallest(a, n, l, r)+ "<br>" );
} // Driver Code let a=[1, 2, 2, 4]; let n = a.length; performQueries(a, n); // This code is contributed by rag2127 </script> |
-1 2
Time Complexity: O(M), where M = R-L is the number of elements in the range [L, R]
Auxiliary Space: O(1)
Note: Since the constraints of the question were very less, a brute force solution will pass. The solution can be further optimized using a Segment Tree.