本题为标准RMQ问题,仍然用Sparse Table
#include <stdio.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
int N, Q;
int m[200000][18];
int M[200000][18];
int main()
{
int i, j, k, L, R;
/* input */
scanf("%d%d", &N, &Q);
for(i = 0; i < N; ++i){
scanf("%d", &m[i][0]);
M[i][0] = m[i][0];
}
/* get minimum/maximum value in range 2^1 ~ 2^log2(N) */
for(j = 0; (k = 1 << (j+1)) < N; ++j){
for(i = 0; i + k <= N; ++i){
m[i][j+1] = min(m[i][j], m[i+(1<<j)][j]);
M[i][j+1] = max(M[i][j], M[i+(1<<j)][j]);
}
}
/* get maximum - minimum within given range */
while(Q--){
scanf("%d%d", &L, &R);
if(L == R){
puts("0");
continue;
}
--L; --R;
k = R - L + 1;
for(j = 0; (1 << (j+1)) < k; ++j) ;
printf("%d\n", max(M[L][j], M[L + k - (1 << j)][j]) -
min(m[L][j], m[L + k - (1 << j)][j]));
}
return 0;
}