RT,卡72过不去了……
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>
#define int long long
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
int num = 0,f=1; char c = getchar();
while (c<48 || c>57)f=(c=='-'?-1:f),c = getchar();
while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
return num*f;
};
int ans;
const int B=2300;
int a[1000005],b[1000005],c[1000005];
struct qaq{
int l,r,i;
bool operator<(const qaq& b)const
{
return (l/B==b.l/B)?r<b.r:l<b.l;
}
}q[1000005];
inline void add(int k)
{
(b[a[k]]++)?0:ans++;
}
inline void rmv(int k)
{
(--b[a[k]])?0:ans--;
}
signed main()
{
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
int m=read();
for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].i=i;
std::sort(q+1,q+1+m);
int cl=1,cr=0;
for(int i=1;i<=m;i++)
{
int L=q[i].l,R=q[i].r;
while(cl<L)rmv(cl++);
while(cl>L)add(--cl);
while(cr>R)rmv(cr--);
while(cr<R)add(++cr);
c[q[i].i]=ans;
}
for(int i=1;i<=m;i++)printf("%d\n",c[i]);puts("");
}