关于lower_bound和upper_bound:、
lower_bound返回可插入的最小位置的迭代器,即返回第一个符合条件的元素位置。
upper_bound返回可插入的最大位置的迭代器,即返回最后一个符合条件的元素位置。
#include <bits/stdc++.h>
typedef long long ll;

using namespace std;


int main() {
    int a[10] = {1,2,4,4,6,7,8,8,9};
    //第一个大于等于4的位置 
    cout<<lower_bound(a, a+10, 4)-a<<endl;
    //第一个大于4的位置或者最后一个等于4的位置。 
    cout<<upper_bound(a, a+10, 8)-a;
    return 0;
}
答案 :
//遍历一遍,记录当中的完全平方数。
//对于每一组查询,找与左边大或等于的最近的完全平方数,找比右边大的第一个位置或等于的最远的完全平方数,然后回到原来的数组里面相减加一即可。
#include <bits/stdc++.h>


using namespace std;
int a[31622+10];

int main() {
    int num,l, r;
    for (int i=0;i<=31625;i++) {
        a[i] = i;
    }
    int n;
    scanf("%d", &n);
    while (n--) {
        scanf("%d %d", &l, &r);
        int pos1 = lower_bound(a, a+31625, sqrt(l))-a;
        int pos2 = upper_bound(a, a+31625, sqrt(r))-a;
//         cout<<pos1<<" "<<pos2<<endl;
        cout<<max(pos2-pos1,0)<<endl;
        
    }
    
    
    return 0;
}