显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[200005],st[20][200005],f[200005],a2,as[200005],pr[200005],ed[200005];
void ad(long long x,long long y){
for(;x<=n;x+=(x&(-x))) f[x]+=y;
return;
}
long long q(long long x){
long long s=0;
for(;x;x-=(x&(-x))) s+=f[x];
return s;
}
struct nm{
long long l,r,p;
}b[200005];
bool C(nm xx,nm yy){
return xx.r<yy.r;
}
int main(){
freopen("dry.in","r",stdin);
freopen("dry.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],st[0][i]=a[i];
for(int i=1;i<=n;i++) pr[i]=ed[a[i]],ed[a[i]]=i;
for(int i=1;i<20;i++)
for(int j=1;j+(1<<i)<=n;j++)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
for(int i=1;i<=m;i++) cin>>b[i].l>>b[i].r,b[i].p=i;
sort(b+1,b+m+1,C);
for(int i=1,t=1;i<=n;i++){
a2=log2(i-pr[i]);
if(a[i]<=min(st[a2][i-(1<<a2)],st[a2][pr[i]])) ad(pr[i]+1,1);
else ad(1,1);
ad(i+1,-1);
while(b[t].r==i) as[b[t].p]=q(b[t].l),++t;
}
for(int i=1;i<=m;i++) cout<<as[i]<<"\n";
return 0;
}