#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <utility>
#include <array>
#include <string.h>
#include <math.h>
template<typename T>
void fast_scan(T &number) {
number = 0;
bool negative = false;
register int c = getchar();
if (c == '-') {
negative = true;
c = getchar();
}
for (; c > 47 && c < 58; c = getchar()) {
number = 10 * number + (c - 48);
}
if (negative) number *= -1;
}
template<typename T1>
struct pair {
T1 first,second;
static T1 compare;
pair() {
}
pair(T1 x, T1 y) : first(x),second(y){
}
void operator()(T1 x, T1 y) {
first = x;
second = y;
}
bool operator<(const pair<T1> other) const {
if ((first/compare) == (other.first/compare)) return second < other.second;
return (first / compare) < (other.first / compare);
}
};
template<typename T2>
T2 pair<T2>::compare = 1;
int main() {
size_t n; fast_scan(n);
pair<size_t>::compare = size_t(sqrt(n));
struct pair<size_t> pair1;
std::vector<int>v(n);
for (size_t i = 0; i < n; i++) {
fast_scan(v[i]);
}
std::set< std::pair< struct pair<size_t>, size_t> > set;
size_t q; fast_scan(q);
std::vector<long long int>v1(q);
size_t i = 0;
while (q) {
size_t l, r; fast_scan(l); fast_scan(r); --l; --r;
pair1(l, r);
set.insert(std::make_pair(pair1,i));
q--;
i++;
}
int *a = new int[1000000];
memset(a, 0,1000000);
auto it = set.begin();
size_t l = ((*it).first).first; size_t r = l; long long int count = 0;
a[v[l]]++; count++;
while (it!=set.end()) {
while (l < ((*it).first).first) {
l++;
if (l < ((*it).first).first) {
a[v[l]]--;
if (a[v[l]] == 0) --count;
}
}
while ((l > ((*it).first).first)) {
l--;
if ((l > ((*it).first).first)) {
a[v[l]]++;
if (a[v[l]] == 1) ++count;
}
}
while (((*it).first).second > r) {
r++;
a[v[r]]++;
if (a[v[r]] == 1) ++count;
}
while (((*it).first).second < r) {
r--;
a[v[r]]--;
if (a[v[r]] == 0) --count;
}
v1[(*it).second] = count;
it++;
}
for (auto i = v1.begin(); i != v1.end(); i++) std::cout << *i << '\n';
}