题目简介
给定一个数列,求询问区间中的最大最小值之差。
说明
普通方法用线段树或ST算法,对这题来说RMQ就可以了。时间复杂度O(nlogn)。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int linemax[50001][20], linemin[50001][20];
void rmq(int n)
{
for (int j = 1; j < 20; ++j)
for (int i = 1; i <= n; ++i)
if (i + (1 << j) - 1 <= n){
linemax[i][j] = max(linemax[i][j - 1], linemax[i + (1 << (j - 1))][j - 1]);
linemin[i][j] = min(linemin[i][j - 1], linemin[i + (1 << (j - 1))][j - 1]);
}
}
int main(void)
{
int n, len, a, b, x, maxc, minc;
scanf("%d%d", &n, &len);
for (int i = 1; i <= n; ++i){
scanf("%d", &linemax[i][0]);
linemin[i][0] = linemax[i][0];
}
rmq(n);
while(len--){
scanf("%d%d", &a, &b);
x = (int)(log(b - a + 1) / log(2));
maxc = max(linemax[a][x], linemax[b - (1 << x) + 1][x]);
minc = min(linemin[a][x], linemin[b - (1 << x) + 1][x]);
printf("%d\n", maxc - minc);
}
return 0;
}