//二分查找
int bsearch(int *A, int x, int y, int v)
{
int m;
while(x < y)
{
m = x + (y-x)/2;
if(A[m] == v)
return m;
else if(A[m] > v)
y = m;
else
x = m + 1;
}
return -1;
}
//查找元素值相同的子序列中最靠前的下标
int lower_bound(int *A, int x, int y, int v)
{
int m;
while(x < y)
{
m = x + (y-x)/2;
if(A[m] >= v)
y = m;
else
x = m + 1;
}
return x;
}
//查找元素值相同的子序列中最靠后的下标
int upper_bound(int *A, int x, int y, int v)
{
int m;
while(x < y)
{
m = x + (y-x)/2;
if(A[m] <= v)
x = m + 1;
else
y = m;
}
return x;
}
//实际上STL中包含了lower_bound,upper_bound的实现;
//以下代码实现的是在给定的一组数中,输出闭区间a,b内整数的个数;
#include<cstdio>
#include<algorithm>
using namespace std;
int v[10000];
int main()
{
int n, m, a, b;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d", &v[i]);
sort(v, v+n);
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
printf("%d\n", upper_bound(v, v+n, b)-lower_bound(v, v+n, a));
}
}