传送门:http://poj.org/problem?id=3264
题意:给定长度为n的序列,m次询问区间[l,r]的最大值与最小值的差
题解:裸的RMQ问题,果断ST表破之
/*
ID:iamzky
OJ:POJ
Index:3264
Language:C++
*/
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[50010];
int Max[125537][17];
int Min[125537][17];
double log2(double x){
return (double)log(x)/log(2.0);
}
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)Max[i][0]=Min[i][0]=a[i];
for(int j=1;j<=ceil(log2(n));j++)
for(int i=1;i<=n;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 query(int l,int r){
int k=(int)log2(r-l+1);
int maxx=max(Max[l][k],Max[r-(1<<k)+1][k]);
int minn=min(Min[l][k],Min[r-(1<<k)+1][k]);
return maxx-minn;
}
void zky(){
while(m--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
}
int main(){
init();
zky();
return 0;
}