原题链接:传送门
RMQ(区间最值问题)模板题。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 1e5+10;
int Max[N][20],Min[N][20];
void RMQ(int num) {
for(int j=1; j<20; j++) {
for(int i=1; i+(1<<j)-1 <= num ; i++) {
Max[i][j] = max(Max[i][j-1],Max[i + (1<<(j-1))][j-1]);
Min[i][j] = min(Min[i][j-1],Min[i + (1<<(j-1))][j-1]);
}
}
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%d",&Max[i][0]);
Min[i][0] = Max[i][0];
}
RMQ(n);
int l,r;
for(int i=0; i<m; i++) {
scanf("%d%d",&l,&r);
int k = (int) (log(r-l+1.0) / log(2.0));
int maximum = max(Max[l][k] ,Max[r-(1<<k)+1][k]);
int minimum = min(Min[l][k] ,Min[r-(1<<k)+1][k]);
printf("%d\n",maximum - minimum);
}
return 0;
}
参考博客:https://blog.csdn.net/niushuai666/article/details/6624672