Find the value of max(f(x)) – min(f(x)) for a given F(x)

Given two sequences of N integers consisting of both positive and negative integers inclusive 0 (sequence A and sequence B). Then there will be Q queries, in each, you will be given two integers l and r (r>=l). Let’s define a function:

   \h \LARGE f(x, y)=\sum_{i=l}^r(A_i*x-B_i*y)
The task is to print the value of Max(f(x, y))Min(f(x, y)) for each query.

Examples:



Input: 
N = 5, Q = 2
A[] = 0 7 3 4 5
B[] = 0 3 1 2 3
l = 1, r = 1
l = 1, r = 3

Output: 
0
917448

Input: 
N = 5, Q = 2
A[] = 0 -8 3 4 -9
B[] = 0 -3 -5 2 3
l = 1, r = 1
l = 1, r = 3

Output:
0
851916

Approach: If we clearly see the function only depends on the value of x and y which can be easily calculated by seeing the nature of the summation of the individual arrays. First, we precalculate the prefix sum of both the arrays and then we just see the nature of the summations. And always the value of x and y will either be 32766 or -32766 as we are taking the modulo of them.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 200006
#define CONS 32766
  
// Function to calculate the value
void calc(ll a[], ll b[], ll lr[], ll q, ll n)
{
    ll M, m, i, j, k, l, r, suma, sumb, cc;
    cc = 0;
  
    // forming the prefix sum arrays
    for (i = 0; i < n - 1; ++i) {
        a[i + 1] += a[i];
        b[i + 1] += b[i];
    }
  
    while (q--) {
        // Taking the query
        l = lr[cc++];
        r = lr[cc++];
        l -= 2;
        r -= 1;
  
        // finding the sum in the range l to r in array a
        suma = a[r];
  
        // finding the sum in the range l to r in array b
        sumb = b[r];
        if (l >= 0) {
            suma -= a[l];
            sumb -= b[l];
        }
  
        // Finding the max value of the function
        M = max(CONS * suma + CONS * sumb,
                -CONS * suma - CONS * sumb);
        M = max(M, max(CONS * suma - CONS * sumb,
                       -CONS * suma + CONS * sumb));
  
        // Finding the min value of the function
        m = min(CONS * suma + CONS * sumb,
                -CONS * suma - CONS * sumb);
        m = min(m, min(CONS * suma - CONS * sumb,
                       -CONS * suma + CONS * sumb));
  
        cout << (M - m) << "\n";
    }
}
  
// Driver code
int main()
{
    ll n = 5, q = 2;
    ll a[5] = { 0, 7, 3, 4, 5 };
    ll b[5] = { 0, 3, 1, 2, 3 };
  
    ll lr[q * 2];
    lr[0] = 1;
    lr[1] = 1;
    lr[2] = 1;
    lr[3] = 3;
  
    calc(a, b, lr, q, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of above approach
  
import java.util.*;
  
class GFG
{
      
        static final int MAX=200006;
        static final int CONS=32766;
          
        // Function to calculate the value
        static void calc(int a[], int b[], int lr[], int q, int n)
        {
            int M, m, i, j, k, l, r, suma, sumb, cc;
            cc = 0;
          
            // forming the prefix sum arrays
            for (i = 0; i < n - 1; ++i) 
            {
                a[i + 1] += a[i];
                b[i + 1] += b[i];
            }
          
            while (q!=0)
            {
                // Taking the query
                l = lr[cc++];
                r = lr[cc++];
                l -= 2;
                r -= 1;
          
                // finding the sum in the range l to r in array a
                suma = a[r];
          
                // finding the sum in the range l to r in array b
                sumb = b[r];
                if (l >= 0) {
                    suma -= a[l];
                    sumb -= b[l];
                }
          
                // Finding the max value of the function
                M = Math.max(CONS * suma + CONS * sumb,
                        -CONS * suma - CONS * sumb);
                M = Math.max(M, Math.max(CONS * suma - CONS * sumb,
                            -CONS * suma + CONS * sumb));
          
                // Finding the min value of the function
                m = Math.min(CONS * suma + CONS * sumb,
                        -CONS * suma - CONS * sumb);
                m = Math.min(m, Math.min(CONS * suma - CONS * sumb,
                            -CONS * suma + CONS * sumb));
          
                System.out.println((M - m) );
                q--;
            }
        }
          
        // Driver code
        public static void  main(String [] args)
        {
            int n = 5, q = 2;
            int []a = { 0, 7, 3, 4, 5 };
            int []b = { 0, 3, 1, 2, 3 };
          
            int []lr=new int[q * 2];
            lr[0] = 1;
            lr[1] = 1;
            lr[2] = 1;
            lr[3] = 3;
          
            calc(a, b, lr, q, n);
          
              
        }
// This code is contributed by ihritik
  
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of 
# above approach
  
MAX = 200006
CONS = 32766
  
# Function to calculate the value
def calc(a, b, lr, q, n):
  
    cc = 0
  
    # forming the prefix sum arrays
    for i in range(n - 1) :
        a[i + 1] += a[i]
        b[i + 1] += b[i]
  
    while (q > 0) :
        # Taking the query
        l = lr[cc]
        cc +=1
        r = lr[cc]
        cc += 1
        l -= 2
        r -= 1
  
        # finding the sum in the range l 
        # to r in array a
        suma = a[r]
  
        # finding the sum in the range 
        # l to r in array b
        sumb = b[r]
        if (l >= 0) :
            suma -= a[l]
            sumb -= b[l]
  
        # Finding the max value of the function
        M = max(CONS * suma + CONS * sumb,
                -CONS * suma - CONS * sumb)
        M = max(M, max(CONS * suma - CONS * sumb,
                    -CONS * suma + CONS * sumb))
  
        # Finding the min value of the function
        m = min(CONS * suma + CONS * sumb,
                -CONS * suma - CONS * sumb)
        m = min(m, min(CONS * suma - CONS * sumb,
                    -CONS * suma + CONS * sumb))
  
        print(M - m)
          
        q -= 1
  
# Driver code
if __name__ == "__main__":
      
    n = 5
    q = 2
    a = [ 0, 7, 3, 4, 5 ]
    b = [ 0, 3, 1, 2, 3 ]
  
    lr = [0]*(q * 2)
    lr[0] = 1
    lr[1] = 1
    lr[2] = 1
    lr[3] = 3
  
    calc(a, b, lr, q, n)
  
# This code is contributed by 
# ChitraNayal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
using System;
  
class GFG
{
  
// static int MAX=200006;
static int CONS = 32766;
  
// Function to calculate the value
static void calc(int []a, int []b, 
                 int []lr, int q, int n)
{
    int M, m, i, l, r, suma, sumb, cc;
    cc = 0;
  
    // forming the prefix sum arrays
    for (i = 0; i < n - 1; ++i) 
    {
        a[i + 1] += a[i];
        b[i + 1] += b[i];
    }
  
    while (q != 0)
    {
        // Taking the query
        l = lr[cc++];
        r = lr[cc++];
        l -= 2;
        r -= 1;
  
        // finding the sum in the
        // range l to r in array a
        suma = a[r];
  
        // finding the sum in the 
        // range l to r in array b
        sumb = b[r];
        if (l >= 0) 
        {
            suma -= a[l];
            sumb -= b[l];
        }
  
        // Finding the max value of the function
        M = Math.Max(CONS * suma + CONS * sumb, 
                    -CONS * suma - CONS * sumb);
        M = Math.Max(M, Math.Max(CONS * suma - CONS * sumb,
                                -CONS * suma + CONS * sumb));
  
        // Finding the min value of the function
        m = Math.Min(CONS * suma + CONS * sumb,
                    -CONS * suma - CONS * sumb);
        m = Math.Min(m, Math.Min(CONS * suma - CONS * sumb,
                                -CONS * suma + CONS * sumb));
  
        Console.WriteLine((M - m));
        q--;
    }
}
  
// Driver code
public static void Main()
{
    int n = 5, q = 2;
    int []a = { 0, 7, 3, 4, 5 };
    int []b = { 0, 3, 1, 2, 3 };
  
    int []lr = new int[q * 2];
    lr[0] = 1;
    lr[1] = 1;
    lr[2] = 1;
    lr[3] = 3;
  
    calc(a, b, lr, q, n);
}
}
  
// This code is contributed by anuj_67

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of above approach
$MAX = 200006;
$CONS = 32766;
  
// Function to calculate the value
function calc($a, $b, $lr, $q, $n)
{
    global $MAX ;
    global $CONS;
    $M; $m; $i; $j; $k
    $l; $r; $suma; $sumb; $cc;
    $cc = 0;
  
    // forming the prefix sum arrays
    for ($i = 0; $i < $n - 1; ++$i)
    {
        $a[$i + 1] += $a[$i];
        $b[$i + 1] += $b[$i];
    }
  
    while ($q--)
    {
        // Taking the query
        $l = $lr[$cc++];
        $r = $lr[$cc++];
        $l -= 2;
        $r -= 1;
  
        // finding the sum in the range 
        // l to r in array a
        $suma = $a[$r];
  
        // finding the sum in the range 
        // l to r in array b
        $sumb = $b[$r];
        if ($l >= 0)
        {
            $suma -= $a[$l];
            $sumb -= $b[$l];
        }
  
        // Finding the max value of the function
        $M = max($CONS * $suma + $CONS * $sumb,
                -$CONS * $suma - $CONS * $sumb);
        $M = max($M, max($CONS * $suma - $CONS * $sumb
                        -$CONS * $suma + $CONS * $sumb));
  
        // Finding the min value of the function
        $m = min($CONS * $suma + $CONS * $sumb,
                -$CONS * $suma - $CONS * $sumb);
        $m = min($m, min($CONS * $suma - $CONS * $sumb,
                        -$CONS * $suma + $CONS * $sumb));
  
        echo ($M - $m) , "\n";
    }
}
  
// Driver code
$n = 5; $q = 2;
$a = array(0, 7, 3, 4, 5 );
$b = array( 0, 3, 1, 2, 3 );
$lr[0] = 1;
$lr[1] = 1;
$lr[2] = 1;
$lr[3] = 3;
  
calc($a, $b, $lr, $q, $n);
  
// This code is contributed by anuj_67
?>

chevron_right


Output:

0
917448


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : ihritik, vt_m, chitranayal