Skip to content
Related Articles

Related Articles

Kth smallest pair and number of pairs less than a given pair (x, y)

View Discussion
Improve Article
Save Article
  • Last Updated : 20 Jul, 2021
View Discussion
Improve Article
Save Article

Given N pairs, the task is to find the Kth smallest pair and the number of pairs less than the given pair (x, y).

Examples:

Input: pairs[][] = {{23, 20}, {23, 10}, {23, 30}, {12, 35}, {12, 22}}, K = 3, (x, y) = (23, 20)
Output:
{23, 10}
3

Input: pairs[][] = {{23, 20}, {23, 10}, {23, 30}, {12, 35}, {12, 22}}, K = 2, (x, y) = (12, 35)
Output:
{12, 35}
1

Naive Approach: The above problem can be solved by finding all pairs from array, and then printing the Kth smallest pair and the count of pairs less than (x, y) respectively.

Policy Based Data Structure Approach: Following is a code showing policy-based data structure as MAP. It can add/remove pair of elements, can find the number of pairs less than (x, y), Kth smallest pair, etc in O(log N) time. The specialty of this map is that we have access to the indices that the pair of elements would have in a sorted 2D array. If the pair does not appear in the map, we get the position that the pair would have in the map.




// C++ implementation of the approach
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>
#include <iostream>
using namespace __gnu_pbds;
using namespace std;
  
// A new data structure is defined
// Please refer https:// goo.gl/WVDL6g
typedef tree<pair<int, int>, null_type,
             less<pair<int, int> >,
             rb_tree_tag, tree_order_statistics_node_update>
    ordered_map;
  
// Driver code
int main()
{
    ordered_map om;
  
    om.insert({ 23, 20 });
    om.insert({ 23, 10 });
    om.insert({ 23, 30 });
    om.insert({ 12, 35 });
    om.insert({ 12, 22 });
  
    int K = 2, x = 12, y = 35;
  
    cout << "{" << om.find_by_order(K - 1)->first << ", "
         << om.find_by_order(K - 1)->second << "}\n";
  
    cout << om.order_of_key({ x, y }) << endl;
  
    return 0;
}

Output:

{12, 35}
1

My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!