版权声明:转载请告知博主并要注明出处嗷~ https://blog.csdn.net/Akatsuki__Itachi/article/details/82019705
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define memset(a,v) memset(a,v,sizeof(a))
#define eps 1.0E-8
using namespace std;
const int MAXL(1e6);
const int INF(0x3f3f3f3f);
const int mod(1e9+7);
typedef long long int LL;
int cnt[MAXL+50];
int a[MAXL+50];
int res[MAXL+50];
int block;
int ans=0;
struct node
{
int l,r,order;
bool operator < (const node &cmp)const{
return l/block==cmp.l/block ? r<cmp.r : l/block<cmp.l/block;
}
}s[MAXL+50];
void add(int i)
{
cnt[a[i]]++;
if(cnt[a[i]]==1)
ans++;
}
void del(int i)
{
cnt[a[i]]--;
if(cnt[a[i]]==0)
ans--;
}
int main()
{
int n,m;
scanf("%d",&n);
block=sqrt(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",&s[i].l,&s[i].r);
s[i].order=i;
}
sort(s+1,s+m+1);
int L=s[1].l,R=L-1;
for(int i=1;i<=m;i++)
{
while(R<s[i].r) add(++R);
while(L>s[i].l) add(--L);
while(L<s[i].l) del(L++);
while(R>s[i].r) del(R--);
res[s[i].order]=ans;
}
for(int i=1;i<=m;i++)
printf("%d\n",res[i]);
}