#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_set>
using namespace std;
const int N = 1000005;
int a[N], last[N], ans[N];
int n, m;
int s[N];
struct node
{
int l, r, id; // 查询的区间端点,查询的编号
bool operator<(node b) {
return r < b.r;
}
}q[N];
int lowbit(int x) {
return x & (-x);
}
void add(int x, int p) {
for (int i = x; i <= n; i += lowbit(i)) {
s[i] += p;
}
}
int find(int x) {
if (x == 0) return 0;
return s[x] + find(x - lowbit(x));
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q + 1, q + 1 + m); // 查询需要按照右端点排序
for (int i = 1, lp = 1; i <= m; i++) { // 枚举每个查询
for (int j = lp; j <= q[i].r; j++) {
if (last[a[j]]) add(last[a[j]], -1); // a 上次的位置减去 1 ,只保留最后边的点
// 注意 last[j]记录的是 j 这个值上次出现的下标
// 所以每次出现值的时候才会 从 0 改为一个下标
add(j, 1);
last[a[j]] = j;
}
// 更新处理的右边 lp 为下一个位置
lp = q[i].r+1;
ans[q[i].id] = find(q[i].r) - find(q[i].l - 1);
}
for (int i = 1; i <= m; i++) {
printf("%d\n", ans[i]);
}
return 0;
}