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: Accepted)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
typedef unsigned long long ull;

#define X first
#define Y second
#define pb push_back
#define mp make_pair
#define ep emplace_back
#define EL printf("\n")
#define sz(A) (int) A.size()
#define FOR(i,l,r) for (int i=l;i<=r;i++)
#define FOD(i,r,l) for (int i=r;i>=l;i--)
#define fillchar(a,x) memset(a, x, sizeof (a))
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);


struct two {
	int i, j, type, id;
};

const int   N = 500001, Q = 500001, A = 1000001;
int         n, q, res[Q], last_pos[A], bit[N];
two        a[N+Q];

bool cmp(two u, two v) {
	return (u.j < v.j or (u.j == v.j and u.type < v.type));
}

void update(int x, int k) {
	for (x; x<=n; x+=x&-x) bit[x] += k;
}

int get(int x) {
	int ans = 0;
	for (x; x>0; x-=x&-x) ans += bit[x];
	return ans;
}



int main() {

	scanf("%d%d", &n,&q);
	for (int i=1; i<=n; i++)
		scanf("%d", &a[i].i), a[i].j = i, a[i].type = -1;
	for (int i=1; i<=q; i++)
		scanf("%d%d", &a[i+n].i, &a[i+n].j), a[i+n].id = i;

	sort(a+1,a+n+q+1,cmp);

	for (int i=1; i<=n+q; i++) {
		if (a[i].type == -1) {
			update(a[i].j, 1);
			if (last_pos[a[i].i] > 0) update(last_pos[a[i].i], -1);
			last_pos[a[i].i] = a[i].j;
		} else {
			res[a[i].id] = get(a[i].j) - get(a[i].i-1);
		}
	}

	for (int i=1; i<=q; i++) printf("%d\n", res[i]);

	return 0;
}