检验模板
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N = 200005;
int n, m;
int rmax[N][20], rmin[N][20], rmi[N], dp[N];
void rmqinit(int *A, int n) {
rmi[0] = -1;
for (int i = 1; i <= n; i++) {
rmi[i] = ((i&(i - 1)) == 0) ? rmi[i - 1] + 1 : rmi[i - 1];
rmax[i][0] = A[i];
rmin[i][0] = A[i];
}
for (int j = 1; j <= rmi[n]; j++) {
for (int i = 1; i + (1<<j) - 1 <= n; i++) {
rmax[i][j] = max(rmax[i][j - 1], rmax[i + (1<<(j - 1))][j - 1]);
rmin[i][j] = min(rmin[i][j - 1], rmin[i + (1<<(j - 1))][j - 1]);
}
}
}
int rmqmax(int l, int r) {
int k = rmi[r - l + 1];
return max(rmax[l][k], rmax[r - (1<<k) + 1][k]);
}
int rmqmin(int l, int r) {
int k = rmi[r - l + 1];
return min(rmin[l][k], rmin[r - (1<<k) + 1][k]);
}
int main() {
while (~scanf("%d%d", &n, &m)) {
for (int i = 1; i <= n; i++) scanf("%d", &dp[i]);
rmqinit(dp, n);
int l, r;
while (m--) {
scanf("%d%d", &l, &r);
printf("%d\n", rmqmax(l, r) - rmqmin(l, r));
}
}
return 0;
}