题目链接:https://www.jisuanke.com/course/615/28147/
题目思路:RMQ模板题
代码:
#include <bits/stdc++.h>
using namespace std;
int f[200010][20];
int f2[200010][20];//最小值
int lg2(int n)//确定查询时候的分界值
{
return log(double(n))/log(2);
}
void rmq(vector<int> a){//预处理,利用了动态规划,复杂度nlogn
int n=a.size();
for(int i=0;i<n;i++) f[i][0]=a[i],f2[i][0]=a[i];
for(int j=1;(1<<j)<=n;j++){
for(int i=0;i+(1<<j)-1<n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]),f2[i][j]=min(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
}
}
int query(int l,int r)//查询操作
{
int k=lg2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k])-min(f2[l][k],f2[r-(1<<k)+1][k]);
}
int main()
{
int n,q;scanf("%d%d",&n,&q);
vector<int>a;
while(n--){
int x;scanf("%d",&x);
a.push_back(x);
}
rmq(a);
while(q--){
int l,r;scanf("%d%d",&l,&r);
printf("%d\n",query(l-1,r-1));
}
}