Queries to find the maximum and minimum array elements excluding elements from a given range | C # program for the above approach ; Function to find the maximum and minimum array elements up to the i - th index ; Traverse the array ; Compare current value with maximum and minimum values up to previous index ; Function to find the maximum and minimum array elements from i - th index ; Traverse the array in reverse ; Compare current value with maximum and minimum values in the next index ; Function to find the maximum and minimum array elements for each query ; If no index remains after excluding the elements in a given range ; Find maximum and minimum from from the range [ R + 1 , N - 1 ] ; Find maximum and minimum from from the range [ 0 , N - 1 ] ; Find maximum and minimum values from the ranges [ 0 , L - 1 ] and [ R + 1 , N - 1 ] ; Print the maximum and minimum value ; Function to perform queries to find the minimum and maximum array elements excluding elements from a given range ; Size of the array ; Size of query array ; prefix [ i ] [ 0 ] : Stores the maximum prefix [ i ] [ 1 ] : Stores the minimum value ; suffix [ i ] [ 0 ] : Stores the maximum suffix [ i ] [ 1 ] : Stores the minimum value ; Function calls to store maximum and minimum values for respective ranges ; Driver Code ; Given array
using System ; public class GFG { static void prefixArr ( int [ ] arr , int [ , ] prefix , int N ) { for ( int i = 0 ; i < N ; i ++ ) { if ( i == 0 ) { prefix [ i , 0 ] = arr [ i ] ; prefix [ i , 1 ] = arr [ i ] ; } else { prefix [ i , 0 ] = Math . Max ( prefix [ i - 1 , 0 ] , arr [ i ] ) ; prefix [ i , 1 ] = Math . Min ( prefix [ i - 1 , 1 ] , arr [ i ] ) ; } } } static void suffixArr ( int [ ] arr , int [ , ] suffix , int N ) { for ( int i = N - 1 ; i >= 0 ; i -- ) { if ( i == N - 1 ) { suffix [ i , 0 ] = arr [ i ] ; suffix [ i , 1 ] = arr [ i ] ; } else { suffix [ i , 0 ] = Math . Max ( suffix [ i + 1 , 0 ] , arr [ i ] ) ; suffix [ i , 1 ] = Math . Min ( suffix [ i + 1 , 1 ] , arr [ i ] ) ; } } } static void maxAndmin ( int [ , ] prefix , int [ , ] suffix , int N , int L , int R ) { int maximum , minimum ; if ( L == 0 && R == N - 1 ) { Console . WriteLine ( " No ▁ maximum ▁ and ▁ minimum ▁ value " ) ; return ; } else if ( L == 0 ) { maximum = suffix [ R + 1 , 0 ] ; minimum = suffix [ R + 1 , 1 ] ; } else if ( R == N - 1 ) { maximum = prefix [ L - 1 , 0 ] ; minimum = prefix [ R - 1 , 1 ] ; } else { maximum = Math . Max ( prefix [ L - 1 , 0 ] , suffix [ R + 1 , 0 ] ) ; minimum = Math . Min ( prefix [ L - 1 , 1 ] , suffix [ R + 1 , 1 ] ) ; } Console . WriteLine ( maximum + " ▁ " + minimum ) ; } static void MinMaxQueries ( int [ ] a , int [ , ] Q ) { int N = a . GetLength ( 0 ) ; int q = Q . GetLength ( 0 ) ; int [ , ] prefix = new int [ N , 2 ] ; int [ , ] suffix = new int [ N , 2 ] ; prefixArr ( a , prefix , N ) ; suffixArr ( a , suffix , N ) ; for ( int i = 0 ; i < q ; i ++ ) { int L = Q [ i , 0 ] ; int R = Q [ i , 1 ] ; maxAndmin ( prefix , suffix , N , L , R ) ; } } static public void Main ( ) { int [ ] arr = { 2 , 3 , 1 , 8 , 3 , 5 , 7 , 4 } ; int [ , ] queries = { { 4 , 6 } , { 0 , 4 } , { 3 , 7 } , { 2 , 5 } } ; MinMaxQueries ( arr , queries ) ; } }