#include<bits/stdc++.h>
using namespace std;
int n,q;
int ST1[100005][25][25];
int ST2[100005][25][25];
int power[25];
int lg[100005];
int getMin(int lt,int rt,int k){
int len=rt-lt+1;
return min(ST2[lt][lg[len]][k],ST2[rt-power[lg[len]]+1][lg[len]][k]);
}
int getMax(int lt,int rt,int k){
int len=rt-lt+1;
return max(ST1[lt][lg[len]][k],ST1[rt-power[lg[len]]+1][lg[len]][k]);
}
signed main(){
power[0]=1;
lg[0]=-1;
for(int i=1;i<=100000;i++){
lg[i]=lg[i/2]+1;
}
for(int i=1;i<=20;i++){
power[i]=power[i-1]*2;
}
scanf("%d",&n);
scanf("%d",&q);
for(int i=1;i<=n;i++){
scanf("%d",&ST1[i][0][0]);
ST2[i][0][0]=ST1[i][0][0];
}
for(int j=1;j<=lg[n];j++){
for(int i=1;i+power[j]-1<=n;i++){
ST1[i][j][0]=max(ST1[i][j-1][0],ST1[i+power[j-1]][j-1][0]);
ST2[i][j][0]=min(ST2[i][j-1][0],ST2[i+power[j-1]][j-1][0]);
}
}
for(int k=1;k<=lg[n];k++){
for(int j=1;j<=lg[n];j++){
for(int i=1;i+power[j]-1<=n;i++){
ST1[i][j][k]=getMax(ST2[i][j][k-1],ST1[i][j][k-1],k-1);
ST2[i][j][k]=getMin(ST2[i][j][k-1],ST1[i][j][k-1],k-1);
}
}
}
while(q--){
int lt,rt;
scanf("%d%d",<,&rt);
if(lt==1&&rt==n){
puts("0");
continue;
}
int ans=0;
for(int i=lg[n];i>=0;i--){
int tmp1=getMin(lt,rt,i);
int tmp2=getMax(lt,rt,i);
if(tmp1!=1||tmp2!=n){
lt=tmp1,rt=tmp2;
ans+=1<<i;
}
}
int tmp1=getMin(lt,rt,0);
int tmp2=getMax(lt,rt,0);
if(tmp1!=1||tmp2!=n){
puts("-1");
}
else{
printf("%d\n",ans+1);
}
}
return 0;
}
无解情况判错了,但是完全看不出来哪里错了