#include <bits/stdc++.h>
using namespace std;
int lmin[200000], rmin[200000], lmax[200000], rmax[200000], x[200000], xs[200000], tw[800001], wrong[200000];
void wrongbuild(int v, int tl, int tr)
{
if(tl>tr) return;
if(tl==tr) {tw[v]=wrong[tl];return;}
int tm=(tl+tr)/2;
wrongbuild(2*v, tl, tm);
wrongbuild(2*v+1, tm+1, tr);
tw[v]=tw[2*v]+tw[2*v+1];
}
int wrongquery(int v, int tl, int tr, int l, int r)
{
if(tl>tr || tl>r || tr<l) return 0;
if(tl>=l && tr<=r) return tw[v];
int tm=(tl+tr)/2;
return wrongquery(2*v, tl, tm, l, r) + wrongquery(2*v+1, tm+1, tr, l,r);
}
int main()
{
int n, q;
cin>>n>>q;
for(int i = 0; i < n; i++)
{
cin>>x[i];
xs[i]=x[i];
if(i==0) {lmin[i]=x[i];lmax[i]=x[i];}
else {
if(x[i-1]>x[i]) wrong[i]=1;
lmin[i]=min(lmin[i-1], x[i]);
lmax[i]=max(lmax[i-1], x[i]);
}
}
sort(xs, xs+n);
rmax[n-1]=x[n-1];
rmin[n-1]=x[n-1];
for(int i = n-2; i >=0; i--)
{
rmin[i]=min(rmin[i+1], x[i]);
rmax[i]=max(rmax[i+1], x[i]);
}
wrongbuild(1, 0, n-1);
for(int i = 0; i < q;i++)
{
int a,b;cin>>a>>b;
if(a+b<n)
{
if(wrongquery(1, 0, n-1, a, n-b-1)!=0) cout <<-1 << endl;
else
{
if(x[a]<lmax[a-1] || x[n-b-1] > rmin[n-b]) cout <<-1 << endl;
else cout << (!(wrongquery(1, 0, n-1, 0, a-1)==0)) + (!(wrongquery(1, 0, n-1, n-b, n-1)==0)) << endl;
}
}
if(a+b==n)
{
if(lmax[a-1]<=rmin[a])
{
cout << (!(wrongquery(1, 0, n-1, 0, a-1)==0)) + (!(wrongquery(1, 0, n-1, a, n-1)==0)) << endl;
}
else cout << -1 << endl;
}
if(a+b>n)
{
if(a==n || b==n) {cout << min(1, wrongquery(1, 0 , n-1, 0, n-1));
cout << (!wrongquery(1, 0, n-1, 0, a-1)==0) + (!wrongquery(1, 0, n-1, n-b, n-1)==0) << endl;
}
}
}