|
| 1 | +#include "pch.h" |
| 2 | + |
| 3 | +#include <assert.h> |
| 4 | + |
| 5 | +#include <functional> |
| 6 | + |
| 7 | +template<typename IterT, typename T> |
| 8 | +IterT lowerBound(IterT begin, IterT end, const T& val) { |
| 9 | + IterT last = end - 1; |
| 10 | + if (val <= *begin) return begin; |
| 11 | + if (val > *last) return end; |
| 12 | + |
| 13 | + while (last - begin > 1) { |
| 14 | + IterT mid = begin + (last - begin) / 2; |
| 15 | + if (val > *mid) begin = mid; |
| 16 | + else last = mid; |
| 17 | + } |
| 18 | + |
| 19 | + return last; |
| 20 | +} |
| 21 | +template<typename IterT, typename T> |
| 22 | +IterT upperBound(IterT begin, IterT end, const T& val) { |
| 23 | + IterT last = end - 1; |
| 24 | + if (val < *begin) return begin; |
| 25 | + if (val >= *last) return end; |
| 26 | + |
| 27 | + while (last - begin > 1) { |
| 28 | + IterT mid = begin + (last - begin) / 2; |
| 29 | + if (val >= *mid) begin = mid; |
| 30 | + else last = mid; |
| 31 | + } |
| 32 | + |
| 33 | + return last; |
| 34 | +} |
| 35 | + |
| 36 | +#define COUNT(a) (sizeof(a)/sizeof((a)[0])) |
| 37 | + |
| 38 | +int main() { |
| 39 | + int a1[] = {3, }; |
| 40 | + int a2[] = {3, 4, 9, 9, 9, 9, }; |
| 41 | + int a3[] = {2, 2, 5, 7, 8, 10, 10, }; |
| 42 | + int a4[] = {1, 4, 5, 5, 5, 6, 9, 10}; |
| 43 | + |
| 44 | + for (int i = -2; i < 12; ++i) { |
| 45 | + assert(lowerBound(a1, a1 + COUNT(a1), i) == lower_bound(a1, a1 + COUNT(a1), i)); |
| 46 | + assert(lowerBound(a2, a2 + COUNT(a2), i) == lower_bound(a2, a2 + COUNT(a2), i)); |
| 47 | + assert(lowerBound(a3, a3 + COUNT(a3), i) == lower_bound(a3, a3 + COUNT(a3), i)); |
| 48 | + assert(lowerBound(a4, a4 + COUNT(a4), i) == lower_bound(a4, a4 + COUNT(a4), i)); |
| 49 | + |
| 50 | + assert(upperBound(a1, a1 + COUNT(a1), i) == upper_bound(a1, a1 + COUNT(a1), i)); |
| 51 | + assert(upperBound(a2, a2 + COUNT(a2), i) == upper_bound(a2, a2 + COUNT(a2), i)); |
| 52 | + assert(upperBound(a3, a3 + COUNT(a3), i) == upper_bound(a3, a3 + COUNT(a3), i)); |
| 53 | + assert(upperBound(a4, a4 + COUNT(a4), i) == upper_bound(a4, a4 + COUNT(a4), i)); |
| 54 | + } |
| 55 | +} |
0 commit comments