题目:https://www.luogu.com.cn/problem/P2880
ST表模板题,直接套就完了,写程序仔细点就好了,,
AC代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int N = 100010;
int maxn[N][50],minn[N][50]; //区间最大值,区间最小值
int a[N];
int lg[N]; //lg函数
inline int read(){
int x =0,f = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x*10 + ch - '0';ch = getchar();}
return x*f;
}
int main(){
int n,q;
n = read();q = read();
for(int i = 1;i<=n;i++){ //初始化
a[i] = read();
maxn[i][0] = minn[i][0] = a[i];
}
for(int i = 2;i<=n;i++){ //初始化lg
lg[i] = lg[i/2] + 1;
}
for(int i = 1;i<=lg[n];i++){
for(int j = 1;j+(1<<i)-1 <= n; j++){
maxn[j][i] = max(maxn[j][i-1],maxn[j+(1<<(i-1))][i-1]);
minn[j][i] = min(minn[j][i-1],minn[j+(1<<(i-1))][i-1]);//注意了下次不要再写错了,min写成max。。
}
}
int l,r;
while(q--){
l = read(),r = read();
int len = lg[r-l+1];
printf("%d\n",max(maxn[l][len],maxn[r - (1<<len)+1][len]) - min(minn[l][len],minn[r-(1<<len)+1][len]));
}
system("pause");
return 0;
}