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)

#include <bits/stdc++.h>
using namespace std;

#define oo 1e9
#define fi first
#define se second
#define sp(iiii) setprecision(iiii)
#define IO ios_base::sync_with_stdio(false); cin.tie(0)
#define ms(aaaa,xxxx) memset(aaaa,xxxx,sizeof(aaaa))
#define cntbit(xxxx) __builtin_popcount(xxxx)
#define getbit(xxxx,aaaa) ((xxxx>>(aaaa-1))&1)
#define _cos(xxxx) cos(xxxx*acos(-1)/180)
#define _sin(xxxx) sin(xxxx*acos(-1)/180)
#define _tan(xxxx) tan(xxxx*acos(-1)/180)
#define PE cout<<fixed

typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<pair<int,int>,int> piii;
typedef pair<long long,long long> pll;
typedef pair<pair<long long,long long>,long long> plll;

const ld pi=acos(-1);
const int blc=708;

piii b[500009];
int n,q,i,a[500009],res[500009],l,r,ans,cnt[500009];

bool comp(piii x,piii y) {
    int tmp1=x.fi.fi/blc;
    int tmp2=x.fi.se/blc;
    if (tmp1!=tmp2) {
        return x.fi.se<y.fi.se;
    }
    return tmp1<tmp2;
}

void addleft() {
    l--;
    cnt[a[l]]++;
    if (cnt[a[l]]==1) {
        ans++;
    }
}

void addright() {
    r++;
    cnt[a[r]]++;
    if (cnt[a[r]]==1) {
        ans++;
    }
}

void removeleft() {
    cnt[a[l]]--;
    if (cnt[a[l]]==0) {
        ans--;
    }
    l++;
}

void removeright() {
    cnt[a[r]]--;
    if (cnt[a[r]]==0) {
        ans--;
    }
    r--;
}

int main(){
    IO;
    cin>>n>>q;
    for (i=1;i<=n;i++) {
        cin>>a[i];
    }
    for (i=1;i<=q;i++) {
        cin>>b[i].fi.fi>>b[i].fi.se;
        b[i].se=i;
    }
    sort(b+1,b+q+1,comp);
    l=1;
    r=0;
    for (i=1;i<=q;i++) {
        //cout<<b[i].fi.fi<<' '<<b[i].fi.se<<' '<<b[i].se<<'\n';
        while ((l!=b[i].fi.fi)||(r!=b[i].fi.se)) {
            //cout<<ans<<'\n';
            if (r<b[i].fi.se) {
                addright();
            }
            if (l>b[i].fi.fi) {
                addleft();
            }
            if (r>b[i].fi.se) {
                removeright();
            }
            if (l<b[i].fi.fi) {
                removeleft();
            }
        }
        res[b[i].se]=ans;
    }
    for (i=1;i<=q;i++) {
        cout<<res[i]<<'\n';
    }
}