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>
#define rep(i,n) for (ll i = 0; i < n; ++i)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const ll INF=1e18;
// Binary Indexed Tree (Fenwick Tree)
// https://youtu.be/lyHk98daDJo?t=7960
template<typename T>
struct BIT {
  int n;
  vector<T> d;
  BIT(int n=0):n(n),d(n+1) {}
    //末尾の要素(i&-i)をたす→一つ上の階層なので、要素の更新の時に使える
  void add(int i, T x=1) {
    for (i++; i <= n; i += i&-i) {
      d[i] += x;
    }
  }
     //末尾の要素(i&-i)を引く→一つ上の一つ左の階層なので、要素の総和をとる時に使える
  T sum(int i) {
    T x = 0;
    for (i++; i; i -= i&-i) {
      x += d[i];
    }
    return x;
  }
    T sum(int l, int r) {
        return sum(r-1) - sum(l-1);
    }
};



int main() {
  ll n,q;
  cin>>n>>q;
  vector<ll> c(n);
  rep(i,n){
    cin>>c[i];
    c[i]--;
  }
  vector<vector<P>>v(n);
  rep(i,q){
    ll l1,r1;
    cin>>l1>>r1;
    l1--;r1--;

    v[r1].push_back(make_pair(i,l1));
  }

  BIT <ll>bi(n);
  vector<ll> x(n,-1);
  vector<ll> ans(q,-1);

  ll now=0;
  rep(i,n){
  //  cout<<"i"<<i<<endl;
    ll col=c[i];
    if (x[col]!=-1){
      bi.add(x[col],-1);
    }
    x[col]=i;
    bi.add(i,1);
    rep(j,v[i].size()){
      ll lnow=v[i][j].second;
      ll idnow=v[i][j].first;

      ll a=bi.sum(lnow,i+1);
    //  cout<<a<<endl;
      ans[idnow]=a;
    }
  }
rep(i,q)cout<<ans[i]<<endl;

}