Problem:
Range Count Query

数列a_1,a_2,..,a_Nが与えられます。

クエリでは、値がl以上r以下の項の個数を答えてください。

入力

N Q
a_1 a_2...a_N
l_1 r_1
l_2 r_2
:
l_q r_q

出力

ans_1
ans_2
:
ans_q

i行目には、i番目のクエリに対する答え、すなわちl_i \leq a_j \leq r_iなるjの個数を出力せよ。

制約

1 \leq N,Q \leq 10^5

1 \leq a_i \leq 10^9

1 \leq l_i \leq r_i \leq 10^9

入力例

6 3
8 6 9 1 2 1
2 8
1 7
3 5

出力例

3
4
0

Solution in C# (judge verdict: Accepted)

using System.Text;
using System.Collections.Generic;
using System;

public class hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = int.Parse(line[0]);
        var q = int.Parse(line[1]);
        line = Console.ReadLine().Trim().Split(' ');
        var a = Array.ConvertAll(line, int.Parse);
        Array.Sort(a);
        getAns(n, q, a);
    }
    static void getAns(int n, int q, int[] a)
    {
        var sb = new StringBuilder();
        var cr = "\n";
        for (int i = 0; i < q; i++)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            var L = int.Parse(line[0]);
            var r = int.Parse(line[1]);
            var ansL = LowerBound(a, L);
            var ansr = UpperBound(a, r);
            sb.Append((ansr - ansL).ToString() + cr);
        }
        Console.Write(sb);
    }
    static int LowerBound<T>(T[] arr, int start, int end, T value, IComparer<T> comparer)
    {
        int low = start;
        int high = end;
        int mid;
        while (low < high)
        {
            mid = ((high - low) >> 1) + low;
            if (comparer.Compare(arr[mid], value) < 0)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
    }
    static int LowerBound<T>(T[] arr, T value) where T : IComparable
    {
        return LowerBound(arr, 0, arr.Length, value, Comparer<T>.Default);
    }
    static int UpperBound<T>(T[] arr, int start, int end, T value, IComparer<T> comparer)
    {
        int low = start;
        int high = end;
        int mid;
        while (low < high)
        {
            mid = ((high - low) >> 1) + low;
            if (comparer.Compare(arr[mid], value) <= 0)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
    }
    static int UpperBound<T>(T[] arr, T value)
    {
        return UpperBound(arr, 0, arr.Length, value, Comparer<T>.Default);
    }
}