int getLastK(int* data, int length, int k, int start, int end)
{
    if (start > end)
    {
        return -1;
    }

    int middleIndex = (start + end) / 2;
    int currentData = data[middleIndex];

    if (middleIndex == k)
    {
        if (middleIndex == end || (middleIndex < end && data[middleIndex + 1] != k) )
        {
            return middleIndex;
        }
        else
        {
            start = middleIndex + 1;
        }
    }
    else if (currentData > k)
    {
        end = middleIndex - 1;
    }
    else
    {
        start = middleIndex + 1;
    }

    return getLastK(data, length, k, start, end);
}
 int GetNumberOfK(vector<int> data ,int k) {
     int result=0;
     
     if(data.empty())
         return 0;
     int start = 0;
     int end = data.size()-1;
     
     int first = getFirstK(data,k,start,end);
     int last = getLastK(data,k,start,end);
     
     if(first >-1 && last >-1)
         result = last - first+1;
     
     return result;
 }
int getNumbersOfK(int* data, int length, int k)
{
    int number = 0;

    if (data != NULL && length > 0)
    {
        int first = getFirstK(data, length, k, 0, length - 1);
        int last = getLastK(data, length, k, 0, length - 1);

        if (first > -1 && last > -1)
        {
            number = last - first + 1;
        }
    }

    return number;
}
 int getLastK(vector<int> data, int k, int start, int end)
 {
     if(start > end)
         return -1;
     int midIndex = (start + end)/2;
     int midData = data[midIndex];
     
     if(midData == k)
     {
      	if(midIndex < data.size()-1 && data[midIndex+1] != k || midIndex == data.size()-1)
             return midIndex;
         else
             start = midIndex+1;
     }
     else if(midData > k)
         end = midIndex-1;
     else
         start = midIndex+1;
         
     return getLastK(data,k,start,end);
 }