POJ3264
ST模板题,区间最大值 - 区间最小值
//#include <bits/stdc++.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;
const int maxn = 50050;
int Max[maxn][20], Min[maxn][20];
int H[maxn];
int N, Q;
void ST_Create(){
for(int i = 1; i <= N; i++)
Max[i][0] = Min[i][0] = H[i];
int k = log2(N);
for(int j = 1; j <= k; j++)
for(int i = 1; i <= N - (1<<j) + 1; 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 ST_query(int l, int r){
int k = log2(r - l + 1);
int MaxN = max(Max[l][k], Max[r-(1<<k)+1][k]);
int MinN = min(Min[l][k], Min[r-(1<<k)+1][k]);
return MaxN - MinN;
}
int main(){
//freopen("input.txt", "r", stdin);
scanf("%d%d", &N, &Q);
for(int i = 1; i <= N; i++)
scanf("%d", &H[i]);
ST_Create();
while(Q--){
int x,y;
scanf("%d%d", &x, &y);
printf("%d\n", ST_query(x, y));
}
return 0;
}
吐槽一下:都9012年了,还需要写这么多头文件



京公网安备 11010502036488号