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 Rust (1.42.0) (judge verdict: Time Limit Exceeded)

#![allow(non_snake_case,unused_imports,dead_code)]
use std::str::FromStr;
use std::collections::{HashMap,HashSet,VecDeque,BinaryHeap};
use std::cmp::{max,min,Reverse,Ordering};
use std::time::{Duration, Instant};
use rand::Rng;

use proconio::input;
use proconio::marker::{Chars,Usize1,Isize1};

fn main() {

    input!(
        N:usize,
        Q:usize,
        C:[Usize1;N],
        LR:[(Usize1,Usize1);Q],
    );

    let mut T = SegmentTree::<HashSet<usize>,_>::new(N,f,HashSet::new());
    for (i,&c) in C.iter().enumerate(){
        T.set(i,{let mut S = HashSet::new();S.insert(c);S});
    }

    for &(l,r) in &LR{
        println!("{}",T.get(l,r+1).len());
    }

}

fn f(x:&HashSet<usize>,y:&HashSet<usize>)->HashSet<usize>{
    (x.union(y)).cloned().collect()
}

struct SegmentTree<N,F>
where F:Fn(&N,&N) ->N{
    n: usize,
    T: Vec<N>,
    func: F,
    identity: N,
}

impl<'a,N:Clone,F> SegmentTree<N,F>
where F:Fn(&N,&N) ->N {
    fn new(n:usize,func:F,identity:N) -> SegmentTree<N,F>{
        let mut T = SegmentTree { n:n,T:Vec::new(),func:func,identity:identity};
        T.init();
        T
    }
    fn init(&mut self){
        self.n = 1<<format!("{:b}",self.n-1).len();
        self.T = (0..(2*self.n-1)).map(|_| self.identity.clone()).collect();
    }
    fn set(&mut self,index:usize,value:N){
        let i = index + self.n - 1;
        self.T[i] = value;
        self._update_parent((i-1)/2);
    }
    fn _update_parent(&mut self,i:usize){
        self.T[i] = (self.func)(&self.T[i*2+1],&self.T[i*2+2]);
        if i>0 { self._update_parent((i-1)/2)}
    }
    fn get(&self,l:usize,r:usize) -> N{
    self._get(l,r,0,0,self.n)
    }
    fn _get(&self,l:usize,r:usize,i:usize,a:usize,b:usize) -> N{
        if l<=a && b<=r {
            self.T[i].clone()
        } else if b<=l || r<=a {
            self.identity.clone()
        } else{
            (self.func)(&self._get(l,r,2*i+1,a,(a+b)/2),
                        &self._get(l,r,2*i+2,(a+b)/2,b))
        }
    }
}