题目链接:Balanced Lineup
题目大意:给定区间,求区间最大值和最小值的差值
题目思路:因为是单纯的查询区间最值,直接RMQ就好了
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 5e4+10;
int N,Q,a[maxn];
int dpmax[maxn][20],dpmin[maxn][20];
void init_RMQ(){
int l = (int)(log(N)/log(2.0));
for(int i = 1;i <= N;i++)
dpmax[i][0] = dpmin[i][0] = a[i];
for(int j = 1;j <= l;j++){
for(int i = 1;i+(1<<j)-1 <= N;i++){
dpmax[i][j] = max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
dpmin[i][j] = min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
}
}
}
int RMQMax(int l,int r){
int k = (int)(log(r-l+1)/log(2.0));
return max(dpmax[l][k],dpmax[r-(1<<k)+1][k]);
}
int RMQMin(int l,int r){
int k = (int)((log(r-l+1))/(log(2.0)));
return min(dpmin[l][k],dpmin[r-(1<<k)+1][k]);
}
int main(){
while(~scanf("%d%d",&N,&Q)){
for(int i = 1;i <= N;i++) scanf("%d",&a[i]);
init_RMQ();
while(Q--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",RMQMax(l,r)-RMQMin(l,r));
}
}
return 0;
}