Open In App

Sudo Placement[1.5] | Second Smallest in Range

Improve
Improve
Like Article
Like
Save
Share
Report

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. 
    1. If the current element is smaller than the first, then update first and second.
    2. 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++




// 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




// 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




# 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#




// 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
// 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
?>


Javascript




<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>


Output

-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.



Last Updated : 27 Apr, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads