一个二分查找的基本题,不同的是需要寻找范围。那么就是要找第一个符合的最小的数,最后一个符合的最大的数。这样可以通过返回下标直接相减加一得到数量。在寻找最大的数的最大下标的时候需要mid = (l+r+1)/2。因为如果相等会让l = mid。但(l+r)/2会偏向于l处。在相邻的时候会出现不变的情况导致死循环。
细节:需要判断是否与题中所给区间有无交际,如果没有的话直接输出0,否则再使用查找函数去查找的话会找到第一位和最后一位停止的,返回的结果不对。
#include <bits/stdc++.h>


using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int n;
int find_min(int x) {
    int l = 1, r = n;
    int mid;
    while (l<r) {
        mid = (l+r)/2;
        if (a[mid]>=x) r = mid;
        else l = mid+1;
    }
    return l;
}

int find_max(int x) {
    int l = 1, r = n;
    int mid;
    while (l<r) {
        mid = (l+r+1)/2;
        if (a[mid]<=x) l = mid;
        else r = mid-1;
    }
    return l;
}

int main() {
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
    }
    sort(a+1, a+n+1);
    int q;
    int x, y;
    cin>>q;
    while (q--) {
        scanf("%d %d", &x, &y);
        if (x>a[n]||y<a[1]) {
            printf("0\n");
            continue;
        }
        int begin = find_min(x);
        int end = find_max(y);
//         if (min_flag==0&&max_flag==0) {
//             printf("0\n");
//             continue;
//         }
        printf("%d\n", end-begin+1);
    }
    
    
    return 0;
}