Implementing upper_bound() and lower_bound() for Ordered Set in C++ Last Updated : 12 Jul, 2025 Summarize Comments Improve Suggest changes Share Like Article Like Report Prerequisites: Ordered Set and GNU C++ PBDS Given an ordered set set and a key K, the task is to find the upper bound and lower bound of the element K in the set in C++. If the element is not present or either of the bounds could not be calculated, then print -1. Ordered set is a policy based data structure in g++ that keeps the unique elements in sorted order. It performs all the operations as performed by the set data structure in STL in log(n) complexity. Apart from that, it performs two additional operations also in log(n) complexity like: 1. order_of_key (K): Number of items strictly smaller than K. 2. find_by_order(K): Kth element in a set (counting from zero). Examples: Input: set[] = {10, 20, 30, 40, 50, 60}, K = 30 Output: Lower Bound of 30: 30 Upper Bound of 30: 40 Explanation: The lower bound for element 30 is 30 located at position 2 The upper bound for element 30 is 40 located at position 3Input: set[] = {10, 20, 30, 40, 50, 60}, K = 60 Output: Lower Bound of 60: 5Upper Bound of 60: -1 Approach: upper_bound(): The upper_bound(key) function returns the element which is just greater than key passed in parameter.lower_bound(): The lower_bound(key) function returns the element which is equivalent to key passed in the parameter. If the key is not present in the ordered set, then the function should return the element which is greater than the parameter.In order to implement the upper_bound and lower_bound functions, the index of the element if present in the ordered set passed as the parameter is found using order_of_key() function.Now, both the lower bound and the upper bound can be found by simply comparing the elements present at this index. Below is the implementation of lower_bound() and upper_bound(): CPP // C++ program to implement the // lower_bound() and upper_bound() // using Ordered Set #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; // Ordered Set Tree typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; ordered_set set1; // Function that returns the lower bound // of the element int lower_bound(int x) { // Finding the position of the element int pos = set1.order_of_key(x); // If the element is not present in the set if (pos == set1.size()) { return -1; } // Finding the element at the position else { int element = *(set1.find_by_order(pos)); return element; } } // Function that returns the upper bound // of the element int upper_bound(int x) { // Finding the position of the element int pos = set1.order_of_key(x + 1); // If the element is not present if (pos == set1.size()) { return -1; } // Finding the element at the position else { int element = *(set1.find_by_order(pos)); return element; } } // Function to print Upper // and Lower bound of K // in Ordered Set void printBound(int K) { cout << "Lower Bound of " << K << ": " << lower_bound(K) << endl; cout << "Upper Bound of " << K << ": " << upper_bound(K) << endl; } // Driver's Code int main() { set1.insert(10); set1.insert(20); set1.insert(30); set1.insert(40); set1.insert(50); int K = 30; printBound(K); K = 60; printBound(K); return 0; } OutputLower Bound of 30: 30 Upper Bound of 30: 40 Lower Bound of 60: -1 Upper Bound of 60: -1 Time Complexity: O(log N)Auxiliary Space: O(1) Comment More infoAdvertise with us Next Article Implementation of lower_bound() and upper_bound() in Vector of Pairs in C++ S saurabhshadow Follow Improve Article Tags : C++ cpp-set Practice Tags : CPP Similar Reads Implementation of lower_bound and upper_bound on Set of Pairs in C++ Prerequisite: set lower_bound() function in C++ STL, set upper_bound() function in C++ STL lower_bound() returns an iterator pointing to the first element in the range [first, last) which has a value greater than or equals to the given value "val". But in set of Pairs lower_bound() for pair(x, y) wi 3 min read Implementation of lower_bound() and upper_bound() in List of Pairs in C++ In this article, we will discuss the implementation of the lower_bound() and upper_bound() in a list of pairs. lower_bound(): It returns an iterator pointing to the first element in the range [first, last) which has a value greater than or equals to the given value âvalâ. But in List of Pairs lower_ 3 min read Implementation of lower_bound() and upper_bound() in Vector of Pairs in C++ Here we will discuss the implementation of the lower_bound() and upper_bound() in vector of pairs. lower_bound(): It returns an iterator pointing to the first element in the range [first, last) which has a value greater than or equal to the given value "val". But in Vector of Pairs lower_bound() for 3 min read std::upper_bound and std::lower_bound for Vector in C++ STL The std::upper_bound() and std::lower_bound() functions are used for binary search operations STL containers that provide random access. They both are defined inside <algorithm> header file. In this article, we will learn how to use the std::upper_bound and std::lower_bound for vector in C++ S 5 min read Binary Search functions in C++ STL (binary_search, lower_bound and upper_bound) In C++, STL provide various functions like std::binary_search(), std::lower_bound(), and std::upper_bound() which uses the the binary search algorithm for different purposes. These function will only work on the sorted data.There are the 3 binary search function in C++ STL:Table of Contentbinary_sea 3 min read Difference between std::set::lower_bound and std::lower_bound in C++ Prerequisite: Random-access Iterators in C++, Bidirectional Iterators in C++. std::lower_bound in C++: The lower_bound() method in C++ is used to return an iterator pointing to the first element in the range [first, last) which has a value not less than the given value. This means that the function 4 min read Like