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>
#include <iostream>
#include <stdio.h>

using namespace std;

// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);

void solve()
{
    int n, q;
    cin >> n >> q;

    vector<map<int, int>> colorMaps(n);
    vector<int> c(n);
    for(int i=0; i<n; i++)
    {
        cin >> c[i];
        colorMaps[i].clear();
        if (i != 0)
            colorMaps[i] = colorMaps[i-1];
        if (colorMaps[i].count(c[i]))
            colorMaps[i][c[i]]++;
        else
            colorMaps[i][c[i]] = 0;

    }

    int l, r;
    while(q--)
    {
        cin >> l >> r;
        l-=2; r--;
        map<int, int> diff = colorMaps[r];

        if(l >= 0)
        {
            vector<map<int, int>::iterator> toDelete;
            for(auto iter = colorMaps[l].begin(); iter != colorMaps[l].end(); iter++)
            {
                int key =  iter->first;
                int value = iter->second;
                diff[key] -= value;
                if (diff[key] == 0)
                {
                    toDelete.push_back(iter);
                    // cout << "going to delete " << iter->first << '\n';
                }
            }
            cout << diff.size() - toDelete.size() << "\n";
        }
        else
            cout << diff.size() << '\n';
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int nCases = 1;
    // cin >> nCases;

    while(nCases--)
        solve();

    return 0;
}