use std::cmp::Ordering;
pub trait Bound<T> {
fn lower_bound(&self, x: &T) -> usize;
fn upper_bound(&self, x: &T) -> usize;
}
impl<T: Ord> Bound<T> for [T] {
fn lower_bound(&self, x: &T) -> usize {
let mut low = 0;
let mut high = self.len();
while low < high {
let mid = (low + high) / 2;
match self[mid].cmp(x) {
Ordering::Less => {
low = mid + 1;
}
_ => {
high = mid;
}
}
}
if low == self.len() {
low - 1
} else {
low
}
}
fn upper_bound(&self, x: &T) -> usize {
let mut low = 0;
let mut high = self.len();
while low < high {
let mid = (low + high) / 2;
match self[mid].cmp(x) {
Ordering::Greater => {
high = mid;
}
_ => {
low = mid + 1;
}
}
}
if low == self.len() {
low - 1
} else {
low
}
}
}