import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// 使用BufferedReader读取输入,PrintWriter输出结果
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
// 读取第一行输入,分割成字符串数组
String[] strA = br.readLine().trim().split("\\s+");
// 解析数组长度n和查询次数q
int n = Integer.parseInt(strA[0]);
int q = Integer.parseInt(strA[1]);
// 创建数组a并读取输入数据
int[] a = new int[n];
String[] strB = br.readLine().trim().split("\\s+");
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(strB[i]);
}
// 对数组进行排序,为后续查询做准备
Arrays.sort(a);
// 处理q次查询
while (q-- > 0) {
// 读取每次查询的左右边界
String[] strC = br.readLine().trim().split("\\s+");
int l = Integer.parseInt(strC[0]);
int r = Integer.parseInt(strC[1]);
// 使用二分查找计算下界和上界
int left = lowerBound(a, l);
int right = upperBound(a, r);
// 输出结果:范围内的元素个数
out.println(right - left);
}
// 关闭IO资源
out.flush();
out.close();
br.close();
}
/**
* 二分查找下界函数
*
* @param a 已排序的数组
* @param target 目标值
* @return 第一个大于等于target的元素的索引
*/
private static int lowerBound(int[] a, int target) {
// 初始化查找范围的 low 和 high 指针
// low 从数组的起始位置 0 开始
// high 从数组长度开始(不包括该位置)
int low = 0, high = a.length;
// 当 low 小于 high 时,继续查找
// 这是循环查找的条件,确保查找范围有效
while (low < high) {
// 计算中间位置 mid
// 使用位运算 (high-low)>>1 代替除法 2,提高效率
// 防止整数溢出,同时确保 mid 总是在 low 和 high 之间
int mid = low + ((high - low) >> 1);
// 如果中间位置的元素大于等于目标值
// 说明目标值可能在左半部分,或者 mid 就是我们要找的位置
// 因此将 high 设置为 mid,继续在左半部分查找
if (a[mid] >= target) {
high = mid;
} else {
// 如果中间位置的元素小于目标值
// 说明目标值一定在右半部分
// 因此将 low 设置为 mid+1,继续在右半部分查找
low = mid + 1;
}
}
// 当循环结束时,low 指向第一个大于等于 target 的元素的位置
// 如果所有元素都小于 target,则返回数组长度
return low;
}
/**
* 二分查找上界函数
*
* @param a 已排序的数组
* @param target 目标值
* @return 第一个大于target的元素的索引
*/
private static int upperBound(int[] a, int target) {
// 初始化查找范围的左右边界,左边界为0,右边界为数组长度
int low = 0, high = a.length;
// 当左边界小于右边界时,继续查找
while (low < high) {
// 计算中间位置,使用位运算防止溢出
int mid = low + ((high - low) >> 1);
// 如果中间位置的值大于目标值,则上界在左半部分
if (a[mid] > target) {
high = mid;
} else {
// 否则上界在右半部分,且不包括中间位置
low = mid + 1;
}
}
// 返回第一个大于target的元素的索引
return low;
}
}