#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using int16=short;using uint16=unsigned short;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;
using float64=double;using float80=long double;constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){x<y?x=y:x;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){x>y?x=y:x;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10,B=317,SB=B+10,NB=(N-11)/B+11;int __test_num=1,__task_id,__tst;using namespace std;void __init();
int n,P[N],q,ans[N];vector<array<int,2>> Q[N];
int A[N],btot,blng[N],L[NB],R[NB];priority_queue<int> qmax[NB];priority_queue<int,vector<int>,greater<int>> qmin[NB];
void rebuild(int bid){
if(!qmin[bid].empty()){
forUp(pos,L[bid],R[bid])if(A[pos]>qmin[bid].top()){
int Apos=exchange(A[pos],qmin[bid].top());qmin[bid].pop();
qmin[bid].push(Apos);
}
priority_queue<int,vector<int>,greater<int>>().swap(qmin[bid]);
}
qmax[bid]=priority_queue<int>(A+L[bid],A+R[bid]+1);
}
void build(){
L[0]=1-B,btot=(n-1)/B+1;forUp(i,1,btot){
L[i]=L[i-1]+B,R[i]=min(R[i-1]+B,n);
forUp(pos,L[i],R[i])blng[pos]=i;
rebuild(i);
}
}
int query(int l,int r,int x){
int lb=blng[l],rb=blng[r];
if(lb==rb){
rebuild(lb);forUp(pos,l,r)if(A[pos]>x)swap(A[pos],x);rebuild(lb);
return x;
}
else{
rebuild(lb);forUp(pos,l,R[lb])if(A[pos]>x)swap(A[pos],x);rebuild(lb);
forUP(bid,lb+1,rb){
qmin[bid].push(x);
if(qmax[bid].top()>x){
int tx=exchange(x,qmax[bid].top());qmax[bid].pop();
qmax[bid].push(tx);
}
}
rebuild(rb);forUp(pos,L[rb],r)if(A[pos]>x)swap(A[pos],x);rebuild(rb);
return x;
}
}
int c[N];
void add(int pos,int val){for(++pos,pos=n+2-pos;pos<=n+1;pos+=pos&-pos)c[pos]+=val;}
int ask(int pos){int ans=0;for(++pos,pos=n+2-pos;pos;pos&=pos-1)ans+=c[pos];return ans;}
bool __med;void __solve(int __test_id){
cin>>n>>q;
forUp(i,1,n)cin>>P[i];
forUp(i,1,q){
int l,r;cin>>l>>r;
Q[r].pushb({i,l});
}
build();
forUp(i,1,n){
int val=P[i];
if(val<n){
int x=query(val+1,n,0);
add(0,1);add(x,-1);
}
rebuild(blng[val]);add(A[val],-1);add(A[val]=i,1);rebuild(blng[val]);
for(auto [qid,l]:Q[i])ans[qid]=ask(l);
}
forUp(i,1,q)cout<<ans[i]<<'\n';
}
signed main(){
__init();
forUp(i,1,__test_num)__solve(i);
cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
return 0;
}
void __init(){
__tst=clock();
#ifndef use_file
//#define use_file
#endif
#ifdef use_file
const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//scanf("%d",&__test_num);
//cin>>__task_id;
//cin>>__test_num;
}