#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=100005;
inline ll read();
ll n,m,a[N],num[N],pos[N],l,r,res,cnt;
struct node {
ll l,r,ID,ans;
}q[N];
bool cmp(node x,node y){
return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
bool cmp1(node x,node y)
{
return x.ID<y.ID;
}
void add(int w)
{
if(a[w]>n) return ;
++num[a[w]];
if(num[a[w]]==a[w]) ++res;
if(num[a[w]]==a[w]+1) --res;
return ;
}
void sub(int w)
{
if(a[w]>n) return ;
--num[a[w]];
if(num[a[w]]==a[w]) ++res;
if(num[a[w]]==a[w]-1) --res;
return ;
}
int main()
{
n=read();m=read();cnt=sqrt(n);
for(int i=1;i<=n;++i)
a[i]=read(),pos[i]=1+(i-1)/cnt;
for(int i=1;i<=m;++i){
q[i].l=read();q[i].r=read();
q[i].ID=i;
}
sort(q+1,q+1+n,cmp);
l=1;r=0;res=0;
for(int i=1;i<=m;++i)
{
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--);
q[i].ans=res;
}
sort(q+1,q+1+m,cmp1);
for(int i=1;i<=m;++i)
printf("%lld\n",q[i].ans);
return 0;
}
inline ll read(){
ll x=0;int b=1;char c=getchar();
while(!isdigit(c)){if(c=='-') b=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*b;
}