RT, 离散化懒的写了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct query
{
long long l,r,k;
}q[500010];
int ans[500010];
short res[50000010];
long long a[500010],tot,l=1,r=0,blk[500010];
void ADD(int pos)
{
tot++;
res[a[pos]]++;
if(res[a[pos]]==2) res[0]++;
else if(res[a[pos]]>2) res[0]--;
}
void SUB(int pos)
{
tot--;
res[a[pos]]--;
if(res[a[pos]]==1) res[0]--;
else if(res[a[pos]]==2) res[0]++;
}
int main()
{
int n,m,ax,by,k;
cin>>n>>m;
res[0]=0;
memset(res,0,sizeof(res));
int blkl=sqrt(n);
// cout<<blkl<<endl;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {blk[i]=((i-1)/blkl)+1;/*cout<<blk[i]<<' ';*/}
// cout<<endl;
for(int i=1;i<=m;i++)
{
cin>>q[i].l>>q[i].r;
q[i].k=i;
}
sort(q+1,q+m+1,[](query x,query y){return (blk[x.l]==blk[y.l])?(x.r<y.r):(blk[x.l]<blk[y.l]);});
for(int i=1;i<=m;i++)
{
// cout<<q[i].l<<' '<<q[i].r<<endl;
// if(q[i].l==q[i].r) {ans[q[i].k].a=0;ans[q[i].k].b=1;continue;}
while(q[i].l<l) ADD(--l);
while(q[i].r>r) ADD(++r);
while(q[i].l>l) SUB(l++);
while(q[i].r<r) SUB(r--);
ans[q[i].k]=res[0];
}
for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
return 0;
}