Sum of all integers in given N ranges - GeeksforGeeks

17 Dec, 2021
Given N ranges of the form [L, R], the task is to find the sum of all integers that lie in any of the given ranges.
Examples:
Input: arr[] = {{1, 5}, {3, 7}}, N = 2Output: 28Explanation: The set of integers that exist in one or more ranges is {1, 2, 3, 4, 5 , 6, 7}. Hence there sum is 28.
Input: ranges[] = {{-12, 15}, {3, 9}, {-5, -2}, {20, 25}, {16, 20}}Output: 247
Approach: The given problem can be solved by an approach similar to the Merge Overlapping Intervals problem. Below are the steps to follow:
Sort the intervals based on increasing order of L.
Push the first interval onto a stack and for each interval do the following:If the current interval does not overlap with the stack top, push it.If the current interval overlaps with stack top and right end of the current interval is more than that of stack top, update stack top with the value of right end of current interval.
If the current interval does not overlap with the stack top, push it.
If the current interval overlaps with stack top and right end of the current interval is more than that of stack top, update stack top with the value of right end of current interval.
After traversing through all intervals, the remaining stack contains the merged intervals. The sum of the merged intervals can be calculated using formula for the sum of an Arithmetic Progression as the range [L, R] forms an AP with a common difference as 1 and the number of elements as R – L + 1. The sum is ((L + R)*(R-L+1))/2.
Below is the implementation of the above approach:
C++
Java
Python3
Javascript
// C++ program for the above approach#include <bits/stdc++.h>#define ll long longusing namespace std; // Function to find the sum of all// integers numbers in range [L, R]ll sumInRange(long L, long R){    ll Sum = ((R - L + 1) / 2)      * (2 * L + (R - L));    return Sum;} // Function to find sum of all integers// that lie in any of the given rangesll calcSum(vector<pair<long, long> > data,           int n){     // Sort intervals in increasing order    // according to their first element    sort(data.begin(), data.end());     // Merging the overlaping intervals    int i, idx = 0;     // Loop to iterate through the array    for (i = 1; i < n; i++) {         // If current interval overlaps        // with the previous intervals        if ((data[idx].second >=             data[i].first)            || (data[i].first ==                data[idx].second + 1)) {             // Merge the previou and the            // current interval            data[idx].second                = max(data[idx].second,                      data[i].second);        }        else {            idx++;            data[idx].second = data[i].second;            data[idx].first = data[i].first;        }    }     // Stores the required sum    ll Sum = 0;     // Loop to calculate the sum of all    // the remaining merged intervals    for (i = 0; i <= idx; i++) {         // Add sum of integers        // in current range        Sum += sumInRange(data[i].first,                          data[i].second);    }     // Return the total Sum    return Sum;} // Driver Codeint main(){    vector<pair<long, long> > vec      = { { -12, 15 },         { 3, 9 },         { -5, -2 },         { 20, 25 },         { 16, 20 } };     cout << calcSum(vec, vec.size());     return 0;}
// Java program for the above approachimport java.util.*;class GFG{ // Function to find the sum of all// integers numbers in range [L, R]static int sumInRange(int L, int R){    int Sum = ((R - L + 1) / 2)      * (2 * L + (R - L));    return Sum;} // Function to find sum of all integers// that lie in any of the given rangesstatic int calcSum(int [][]data,           int n){     // Sort intervals in increasing order    // according to their first element    Arrays.sort(data,(a,b)->{        return a[0]-b[0];    });     // Merging the overlaping intervals    int i, idx = 0;     // Loop to iterate through the array    for (i = 1; i < n; i++) {         // If current interval overlaps        // with the previous intervals        if ((data[idx][1] >=             data[i][0])            || (data[i][0] ==                data[idx][1] + 1)) {             // Merge the previou and the            // current interval            data[idx][1]                = Math.max(data[idx][1],                      data[i][1]);        }        else {            idx++;            data[idx][1] = data[i][1];            data[idx][0] = data[i][0];        }    }     // Stores the required sum    int Sum = 0;     // Loop to calculate the sum of all    // the remaining merged intervals    for (i = 0; i <= idx; i++) {         // Add sum of integers        // in current range        Sum += sumInRange(data[i][0],                          data[i][1]);    }     // Return the total Sum    return Sum;} // Driver Codepublic static void main(String[] args){    int [][]vec      = { { -12, 15 },         { 3, 9 },         { -5, -2 },         { 20, 25 },         { 16, 20 } };     System.out.print(calcSum(vec, vec.length)); }} // This code is contributed by shikhasingrajput
# Python 3 program for the above approach # Function to find the sum of all# integers numbers in range [L, R]def sumInRange(L, R):     Sum = ((R - L + 1) // 2) * (2 * L + (R - L))    return Sum # Function to find sum of all integers# that lie in any of the given rangesdef calcSum(data,            n):     # Sort intervals in increasing order    # according to their first element    data.sort()     # Merging the overlaping intervals    idx = 0     # Loop to iterate through the array    for i in range(1, n):         # If current interval overlaps        # with the previous intervals        if ((data[idx][1] >=             data[i][0])            or (data[i][0] ==                data[idx][1] + 1)):             # Merge the previou and the            # current interval            data[idx][1] = max(data[idx][1],                               data[i][1])         else:            idx += 1            data[idx][1] = data[i][1]            data[idx][0] = data[i][0]    # Stores the required sum    Sum = 0     # Loop to calculate the sum of all    # the remaining merged intervals    for i in range(idx+1):         # Add sum of integers        # in current range        Sum += sumInRange(data[i][0],                          data[i][1])     # Return the total Sum    return Sum # Driver Codeif __name__ == "__main__":     vec = [[-12, 15],           [3, 9],           [-5, -2],           [20, 25],           [16, 20]]     print(calcSum(vec, len(vec)))     # This code is contributed by ukasp.
<script>       // JavaScript code for the above approach        // Function to find the sum of all       // integers numbers in range [L, R]       function sumInRange(L, R) {           let Sum = ((R - L + 1) / 2)               * (2 * L + (R - L));           return Sum;       }        // Function to find sum of all integers       // that lie in any of the given ranges       function calcSum(data, n) {            // Sort intervals in increasing order           // according to their first element           data.sort(function (a, b) { return a.first - b.first })            // Merging the overlaping intervals           let i, idx = 0;            // Loop to iterate through the array           for (i = 1; i < n; i++) {                // If current interval overlaps               // with the previous intervals               if ((data[idx].second >=                   data[i].first)                   || (data[i].first ==                       data[idx].second + 1)) {                    // Merge the previou and the                   // current interval                   data[idx].second                       = Math.max(data[idx].second,                           data[i].second);               }               else {                   idx++;                   data[idx].second = data[i].second;                   data[idx].first = data[i].first;               }           }            // Stores the required sum           let Sum = 0;            // Loop to calculate the sum of all           // the remaining merged intervals           for (i = 0; i <= idx; i++) {                // Add sum of integers               // in current range               Sum += sumInRange(data[i].first,                   data[i].second);           }            // Return the total Sum           return Sum;       }        // Driver Code        let vec           = [{ first: -12, second: 15 },           { first: 3, second: 9 },           { first: -5, second: -2 },           { first: 20, second: 25 },           { first: 16, second: 20 }];        document.write(calcSum(vec, vec.length));         // This code is contributed by Potta Lokesh   </script>
  
247
 
Time Complexity: O(N*log N)Auxiliary Space: O(1)
 
lokeshpotta20
shikhasingrajput
ukasp
array-range-queries
Greedy
Mathematical
Greedy
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Optimal Page Replacement Algorithm
Program for Best Fit algorithm in Memory Management
Program for First Fit algorithm in Memory Management
Bin Packing Problem (Minimize number of used Bins)
Max Flow Problem Introduction
Program for Fibonacci numbers
C++ Data Types
Set in C++ Standard Template Library (STL)
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples