<script>
// JavaScript code to find number of
// distinct numbers in a subarray
const MAX = 1000001
// structure to store queries
class Query{
constructor(l, r, idx){
this.l = l
this.r = r
this.idx = idx
}
}
// updating the bit array
function update(idx, val, bit, n){
while(idx <= n){
bit[idx] += val
idx += idx & -idx
}
}
// querying the bit array
function query(idx, bit, n){
let summ = 0
while(idx){
summ += bit[idx]
idx -= idx & -idx
}
return summ
}
function answeringQueries(arr, n, queries, q){
// initialising bit array
let bit = new Array(n+1).fill(0)
// holds the rightmost index of
// any number as numbers of a[i]
// are less than or equal to 10^6
let last_visit = new Array(MAX).fill(-1)
// answer for each query
let ans = new Array(q).fill(0);
let query_counter = 0
for(let i=0;i<n;i++){
// If last visit is not -1 update -1 at the
// idx equal to last_visit[arr[i]]
if(last_visit[arr[i]] != -1)
update(last_visit[arr[i]] + 1, -1, bit, n)
// Setting last_visit[arr[i]] as i and
// updating the bit array accordingly
last_visit[arr[i]] = i
update(i + 1, 1, bit, n)
// If i is equal to r of any query store answer
// for that query in ans[]
while(query_counter < q && queries[query_counter].r == i){
ans[queries[query_counter].idx] = query(queries[query_counter].r + 1, bit, n) - query(queries[query_counter].l, bit, n)
query_counter += 1
}
}
// print answer for each query
for(let i=0;i<q;i++)
document.write(ans[i],"</br>")
}
// Driver Code
let a = [1, 1, 2, 1, 3]
let n = a.length
let queries = [new Query(0, 4, 0),new Query(1, 3, 1),new Query(2, 4, 2)]
let q = queries.length
queries.sort((x,y) => x.r-y.r)
answeringQueries(a, n, queries, q)
// This code is contributed by shinjanpatra
</script>