解题思路:
稀疏表模板题。
注意数组要开大点,倍增预处理时容易越界。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-')f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=100005,LogN=20;
int n,m,a[N],mx[N][LogN],mi[N][LogN],Log[N];
int main()
{
//freopen("lx.in","r",stdin);
n=getint(),m=getint();
for(int i=1;i<=n;i++)
a[i]=mx[i][0]=mi[i][0]=getint();
Log[1]=0;
for(int i=2;i<=n;i++)Log[i]=Log[i>>1]+1;
for(int j=1;j<=Log[n];j++)
for(int i=1;i<=n;i++)
{
mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);
mi[i][j]=min(mi[i][j-1],mi[i+(1<<j-1)][j-1]);
}
while(m--)
{
int l=getint(),r=getint(),x=Log[r-l+1];
int t1=max(mx[l][x],mx[r-(1<<x)+1][x]),t2=min(mi[l][x],mi[r-(1<<x)+1][x]);
cout<<t1-t2<<'\n';
}
return 0;
}