lower_bound()返回的是要查找的数的最小下标,upper_bound()则返回的是最大下标
两者都是用二分查找,需要先排序。两者相减得到的则是一共有多少个要查找的数的个数减一

#include <cstdio>
#include <algorithm>

using namespace std;
const int MAXN = 1000;

int n, k;
int a[MAXN];
int lower_bound()
{
    int lb = -1;
    int rb = n;
    bool flag = false;  // 判断是否找到了这个数
    while(rb - lb > 1)  // 直到解的范围不大于1
    {
        int mid = (lb + rb) / 2;
        if(!flag && a[mid] == k)
            flag = true;
        if(a[mid] >= k)
            rb = mid;
        else
            lb = mid;
    }
    if(flag)
        return rb;
    else
        return -1; 
}
int upper_bound()
{
    int lb = -1;
    int rb = n;
    bool flag = false;
    while(rb - lb > 1)
    {
        int mid = (lb + rb) / 2;
        if( !flag && a[mid] == k)
            flag = true;
        if(a[mid] <= k)
            lb = mid;
        else
            rb = mid;
    }
    if(flag)
        return lb;
    else
        return -1;
}

int main()
{
    scanf("%d %d", &n, &k);
    for(int i=0; i<n; i++)
        scanf("%d", &a[i]);
    sort(a, a+n);
    int index1 = lower_bound();
    int index2 = upper_bound();
    printf("%d %d\n", index1, index2);
    printf("%d\n", upper_bound() - lower_bound());



    return 0;
}