int lower_bound(int[] a, int key) {
int lb = 0, ub = a.length-1;
if (a[lb] == key) return lb;
while (ub - lb > 1) {
int mid = (ub + lb) / 2;
if (a[mid] >= key)
ub = mid;
else
lb = mid;
}
return ub;
}
int upper_bound(int[] a, int key) {
int lb = 0, ub = a.length-1;
if (a[ub] == key) return ub + 1;
while (ub - lb > 1) {
int mid = (ub + lb) / 2;
if (a[mid] > key)
ub = mid;
else
lb = mid;
}
return lb+1;
}