#include <iostream>
#include <set>
#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 T, typename T1, typename T2>
class query {
public:
T first, second, third;
static T comp;
static T1 * index;
public:
query() {
}
query(T x, T y,T z) : first(x), second(y),third(z) {
}
public:
static T1* initialise(T2 num) {
index = new T1[num];
return index;
}
public:
query& operator()(T x, T y, T z) {
first = x;
second = y;
third = z;
return *this;
}
bool operator<(const query & other) const {
T comp1 = T (first /comp); T comp2 = T (other.first/comp);
if (comp1 == comp2) return second < other.second;
return comp1 < comp2;
}
};
template<typename T, typename T1, typename T2>
T query<T, T1, T2>::comp;
template<typename T, typename T1, typename T2>
T1 * query<T, T1, T2>::index = nullptr;
int main() {
size_t n; fast_scan(n);
int* input = new int[n]; for (size_t i = 0; i < n; i++) fast_scan(input[i]); size_t q; fast_scan(q);
query<size_t, long long int, size_t> que; que.comp = size_t(sqrt(n));
long long int* count_arr = que.initialise(q);
std::multiset< query<size_t, long long int, size_t> > set;
for (size_t i = 0; i < q; i++) {
size_t l, r; fast_scan(l); fast_scan(r); --l; --r;
set.insert(que(l, r, i));
}
int * F = new int[1000001]; memset(F, 0, 1000001);
auto i = set.begin();
size_t l, r; l = r = (i->first); F[input[l]]++; long long int count = 1;
while (i != set.end()) {
while (l < (i->first)) {
if ((--F[input[l]]) == 0) --count;
l++;
}
while (l > (i->first)) {
--l;
if ((++F[input[l]]) == 1) ++count;
}
while (r < (i->second)) {
++r;
if ((++F[input[r]]) == 1) ++count;
}
while (r > (i->second)) {
if ((--F[input[l]]) == 0) --count;
--r;
}
count_arr[i->third] = count;
i++;
}
for (size_t j = 0; j < q; j++) std::cout << count_arr[j] << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxtYXRoLmg+CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgZmFzdF9zY2FuKFQgJm51bWJlcikgewoJbnVtYmVyID0gMDsKCWJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKCXJlZ2lzdGVyIGludCAgYyA9IGdldGNoYXIoKTsKCWlmIChjID09ICctJykgewoJCW5lZ2F0aXZlID0gdHJ1ZTsKCQljID0gZ2V0Y2hhcigpOwoJfQoJZm9yICg7IGMgPiA0NyAmJiBjIDwgNTg7IGMgPSBnZXRjaGFyKCkpIHsKCQludW1iZXIgPSAxMCAqIG51bWJlciArIChjIC0gNDgpOwoJfQoJaWYgKG5lZ2F0aXZlKSBudW1iZXIgKj0gLTE7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgpjbGFzcyBxdWVyeSB7CnB1YmxpYzoKCVQgZmlyc3QsIHNlY29uZCwgdGhpcmQ7CglzdGF0aWMgVCBjb21wOwoJc3RhdGljIFQxICogaW5kZXg7CnB1YmxpYzoKCXF1ZXJ5KCkgewoKCX0KCXF1ZXJ5KFQgeCwgVCB5LFQgeikgOiBmaXJzdCh4KSwgc2Vjb25kKHkpLHRoaXJkKHopIHsKCgoJfQpwdWJsaWM6CglzdGF0aWMgVDEqIGluaXRpYWxpc2UoVDIgbnVtKSB7CgkJaW5kZXggPSBuZXcgVDFbbnVtXTsKCQlyZXR1cm4gaW5kZXg7Cgl9CnB1YmxpYzoKCXF1ZXJ5JiBvcGVyYXRvcigpKFQgeCwgVCB5LCBUIHopIHsKCQlmaXJzdCA9IHg7CgkJc2Vjb25kID0geTsKCQl0aGlyZCA9IHo7CgkJcmV0dXJuICp0aGlzOwoJfQoJYm9vbCBvcGVyYXRvcjwoY29uc3QgcXVlcnkgJiBvdGhlcikgY29uc3QgewoJCVQgY29tcDEgPSBUIChmaXJzdCAvY29tcCk7IFQgY29tcDIgPSBUIChvdGhlci5maXJzdC9jb21wKTsKCQlpZiAoY29tcDEgPT0gY29tcDIpIHJldHVybiBzZWNvbmQgPCBvdGhlci5zZWNvbmQ7CgkJcmV0dXJuIGNvbXAxIDwgY29tcDI7Cgl9Cn07CnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KVCBxdWVyeTxULCBUMSwgVDI+Ojpjb21wOwp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+ClQxICogcXVlcnk8VCwgVDEsIFQyPjo6aW5kZXggPSBudWxscHRyOwppbnQgbWFpbigpIHsKCXNpemVfdCBuOyBmYXN0X3NjYW4obik7CglpbnQqIGlucHV0ID0gbmV3IGludFtuXTsgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIGZhc3Rfc2NhbihpbnB1dFtpXSk7IHNpemVfdCBxOyBmYXN0X3NjYW4ocSk7CglxdWVyeTxzaXplX3QsIGxvbmcgbG9uZyBpbnQsIHNpemVfdD4gcXVlOyBxdWUuY29tcCA9IHNpemVfdChzcXJ0KG4pKTsKCWxvbmcgbG9uZyBpbnQqIGNvdW50X2FyciA9IHF1ZS5pbml0aWFsaXNlKHEpOwoJc3RkOjptdWx0aXNldDwgcXVlcnk8c2l6ZV90LCBsb25nIGxvbmcgaW50LCBzaXplX3Q+ID4gc2V0OwoJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBxOyBpKyspIHsKCQlzaXplX3QgbCwgcjsgZmFzdF9zY2FuKGwpOyBmYXN0X3NjYW4ocik7IC0tbDsgLS1yOwoJCXNldC5pbnNlcnQocXVlKGwsIHIsIGkpKTsKCX0KCWludCAqIEYgPSBuZXcgaW50WzEwMDAwMDFdOyBtZW1zZXQoRiwgMCwgMTAwMDAwMSk7CglhdXRvIGkgPSBzZXQuYmVnaW4oKTsKCXNpemVfdCBsLCByOyBsID0gciA9IChpLT5maXJzdCk7ICBGW2lucHV0W2xdXSsrOyBsb25nIGxvbmcgaW50IGNvdW50ID0gMTsKCXdoaWxlIChpICE9IHNldC5lbmQoKSkgewoJCXdoaWxlIChsIDwgKGktPmZpcnN0KSkgewoJCQlpZiAoKC0tRltpbnB1dFtsXV0pID09IDApIC0tY291bnQ7CgkJCWwrKzsKCQl9CgkJd2hpbGUgKGwgPiAoaS0+Zmlyc3QpKSB7CgkJCS0tbDsKCQkJaWYgKCgrK0ZbaW5wdXRbbF1dKSA9PSAxKSArK2NvdW50OwoJCX0KCQl3aGlsZSAociA8IChpLT5zZWNvbmQpKSB7CgkJCSsrcjsKCQkJaWYgKCgrK0ZbaW5wdXRbcl1dKSA9PSAxKSArK2NvdW50OwoJCX0KCQl3aGlsZSAociA+IChpLT5zZWNvbmQpKSB7CgkJCWlmICgoLS1GW2lucHV0W2xdXSkgPT0gMCkgLS1jb3VudDsKCQkJLS1yOwoJCX0KCQljb3VudF9hcnJbaS0+dGhpcmRdID0gY291bnQ7CgkJaSsrOwoJfQoJZm9yIChzaXplX3QgaiA9IDA7IGogPCBxOyBqKyspIHN0ZDo6Y291dCA8PCBjb3VudF9hcnJbal0gPDwgJ1xuJzsKfQo=