Problem:
Score : 600 points

Problem Statement

We have N colored balls arranged in a row from left to right; the color of the i-th ball from the left is c_i.

You are given Q queries. The i-th query is as follows: how many different colors do the l_i-th through r_i-th balls from the left have?

Constraints

1\leq N,Q \leq 5 \times 10^5

1\leq c_i \leq N

1\leq l_i \leq r_i \leq N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N Q
c_1 c_2 \cdots c_N
l_1 r_1
l_2 r_2
:
l_Q r_Q

Output

Print Q lines. The i-th line should contain the response to the i-th query.

Sample Input 1

4 3
1 2 1 3
1 3
2 4
3 3

Sample Output 1

2
3
1

The 1-st, 2-nd, and 3-rd balls from the left have the colors 1, 2, and 1 - two different colors.

The 2-st, 3-rd, and 4-th balls from the left have the colors 2, 1, and 3 - three different colors.

The 3-rd ball from the left has the color 1 - just one color.

Sample Input 2

10 10
2 5 6 5 2 1 7 9 7 2
5 5
2 4
6 7
2 2
7 8
7 9
1 8
6 9
8 10
6 8

Sample Output 2

1
2
2
1
2
2
6
3
3
3

Solution in C++ (GCC 9.2.1) (judge verdict: Time Limit Exceeded)

/*input
10 10
2 5 6 5 2 1 7 9 7 2
5 5
2 4
6 7
2 2
7 8
7 9
1 8
6 9
8 10
6 8
*/
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
#define BLOCK 555
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
 
using namespace std;
struct query{
    int l;
    int r;
    int i;
};
query Q[500005];
int ar[500005] , ans[500005];
int fre[500006];
int cnt = 0;
 
bool comp(query a , query b)
{
    if(a.l / BLOCK != b.l/BLOCK)
    return a.l/BLOCK < b.l/BLOCK;
 
    return a.r < b.r;
}
 
void add(int pos)
{
    fre[ar[pos]]++;
    if(fre[ar[pos]] == 1)
    cnt++;
}
 
void remove(int pos)
{
    fre[ar[pos]]--;
    if(fre[ar[pos]] == 0)
    cnt--;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
 
    int n , q;
    cin>>n>>q;
  
    for(int i=0;i<n;i++)
    {cin>>ar[i];
   
    }
   int  i=1;

 
    
    for(int i=0;i<q;i++){
        cin>>Q[i].l>>Q[i].r;
        Q[i].i = i , Q[i].l-- , Q[i].r--;
    }
 
    sort(Q , Q+q , comp);
 
    //why ML = 0 , and MR = -1?
    int ML = 0 , MR = -1;
    for(int i=0;i<q;i++)
    {
        int L = Q[i].l;
        int R = Q[i].r;
 
        while(ML > L)
        ML-- , add(ML);
 
        while(MR < R)
        MR++ , add(MR);
 
        while(ML < L)
        remove(ML) , ML++;
 
        while(MR > R)
        remove(MR) , MR--;
 
        ans[Q[i].i] = cnt;
    }
 
    for(int i=0;i<q;i++)
    cout<<ans[i]<<'\n';
}