class Solution {
public :
int left_bound ( vector< int > & nums, int target)
{
int left = 0 , right = nums. size ( ) ;
while ( left < right)
{
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
right = mid;
else if ( nums[ mid] < target)
left = mid + 1 ;
else
right = mid;
}
if ( left == nums. size ( ) || nums[ left] != target)
return - 1 ;
return left;
}
int right_bound ( vector< int > & nums, int target)
{
int left = 0 , right = nums. size ( ) ;
while ( left < right)
{
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
left = mid + 1 ;
else if ( nums[ mid] < target)
left = mid + 1 ;
else
right = mid;
}
if ( left == 0 || nums[ left - 1 ] != target)
return - 1 ;
return left - 1 ;
}
vector< int > searchRange ( vector< int > & nums, int target) {
if ( nums. size ( ) == 0 )
return { - 1 , - 1 } ;
int left = left_bound ( nums, target) ;
int right = right_bound ( nums, target) ;
return { left, right} ;
}
} ;