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 JAVA (judge verdict: Accepted)

import java.util.*;
public class Main {
    static int[] nums;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int q=sc.nextInt();
        nums=new int[n+1];
        nums[n]=Integer.MAX_VALUE;
        for(int i=0;i<n;i++){
            nums[i]=sc.nextInt();
        }
        Arrays.sort(nums);
        for(int i=0;i<q;i++){
            System.out.println(-(nibul(sc.nextInt())-nibur(sc.nextInt())));
        }
    }
    static int nibul(int q){
        int ans=nums.length/2;
        int toadd=nums.length/2;
        while(true){
            if(ans<0||ans>=nums.length){
                break;
            }
            if(nums[ans]>=q){
                ans-=Math.max(toadd/=2,1);
            }else if(nums[ans+1]<q){
                ans+=Math.max(toadd/=2,1);
            }else{
                break;
            }
            
        }
        return ans;
    }
    static int nibur(int q){
        int ans=nums.length/2;
        int toadd=nums.length/2;
        while(true){
            if(ans<0||ans>=nums.length){
                break;
            }
            if(nums[ans]>q){
                ans-=Math.max(toadd/=2,1);
            }else if(nums[ans+1]<=q){
                ans+=Math.max(toadd/=2,1);
            }else{
                break;
            }
            
        }
        return ans;
    }


    
}