#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <functional>
using namespace std;
int const M = 50000+99;
struct node {
int left,right;
int val ;
}tree[M<<4];
int root[M];
int top=0;
int build(int l,int r) {
int k=top++;
tree[k].val = 0;
if(l==r) return k;
int m = (l+r) >>1;
tree[k].left = build(l,m);
tree[k].right =build(m+1,r);
return k;
}
int insert(int rt,int l,int r,int pos,int val) {
int k= top++;
tree[k] = tree[rt];
tree[k].val = tree[rt].val+val;
if(l==r) return k;
int m = (l+r) >>1;
if(pos<=m){
tree[k].left = insert(tree[rt].left,l,m,pos,val);
}else {
tree[k].right = insert(tree[rt].right,m+1,r,pos,val);
}
return k;
}
int ans;
void query(int rt,int pos,int l,int r) {
if(l==r) {
ans+=tree[rt].val;
return ;
}
int mid = (l+r) >>1;
if(pos<=mid) {
ans += tree[tree[rt].right].val;
query(tree[rt].left,pos,l,mid);
}
else {
query(tree[rt].right,pos,mid+1,r);
}
}
int a[M];
int b[M];
int u[M];
int main(){
int m;
while(cin>>m){
top=0;
for(int i=1;i<=m;i++){
scanf("%d",a+i);
u[i]=a[i];
}
root[0]=build(1,m);
sort(a+1,a+1+m);
memset(b,-1,sizeof(b));
int p = unique(a+1,a+1+m)-a-1;
for(int i=1;i<=m;i++){
int pos = lower_bound(a+1,a+1+p,u[i])-a;
if(b[pos]==-1){
root[i]=insert(root[i-1],1,m,i,1);
}
else {
int t = insert(root[i-1],1,m,b[pos],-1);
root[i]=insert(t,1,m,i,1);
}
b[pos]=i;
}
int q;
cin>>q;
int l,r;
while(q--){
scanf("%d%d",&l,&r);
ans=0;
query(root[r],l,1,m);
printf("%d\n",ans);
}
}
return 0;
}