https://www.nowcoder.com/acm/contest/139/J
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+500;
typedef struct node{
int l,r,No;
}node;
int cmp(node a, node b){
return (a.r==b.r&&a.l<b.l)||a.r<b.r;
}
node q[N];
int n,m,k,tmp,c[N],a[N],vis[N],ans[N];
int lowbit(int x){return x&(-x);}
void update(int x,int val=1){for(;x<=2*n;c[x]+=val,x+=lowbit(x));}
int getsum(int x){ int ret=0;for(;x>0;ret+=c[x],x-=lowbit(x));return ret;}
int main()
{
while(~scanf("%d%d",&n,&m)){
memset(q,0,sizeof(q));
memset(c,0,sizeof(c));
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[n+i]=a[i];}
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);q[i].No=i;
tmp=q[i].r;q[i].r=q[i].l+n;q[i].l=tmp;
}
sort(q+1, q+1+m,cmp);
int L=1;
for(int i=1;i<=m;i++){
for(int j=L;j<=q[i].r;j++){
if(vis[a[j]]){
update(vis[a[j]],-1);
}
update(j,1);
vis[a[j]]=j;
}
L=q[i].r+1;
ans[q[i].No]=getsum(q[i].r)-getsum(q[i].l-1);
}
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
}
return 0;
}