unsigned int lower_bound (T* v, unsigned int max, T t)
{
unsigned int low = 0;
unsigned int mid;
unsigned int hih = max;
while (low < hih)
{
// (1) low < hih
// (2) v[low - 1] < t (if index is valid)
// (3) t <= v[hih] (if index is valid)
mid = (low + hih) / 2;
if (v[mid] < t)
low = mid + 1;
else
hih = mid;
// (4) low <= hih
// (5) hih - low has decreased
// (6) v[low - 1] < t (if index is valid)
// (7) t <= v[hih] (if index is valid)
}
return low;
}