区间查询最大值最小值,ST算法:O(nlogn)初始化+O(1)查询
#include<iostream>
using namespace std;
#include<algorithm>
#include<math.h>
int N,Q;
int height[50005];
int dpmax[50005][20];//从第i个数起长度为2^j的区间内的最大值
int dpmin[50005][20];//从第i个数起长度为2^j的区间内的最小值
void initmax()
{
int i,j;
for(i=1;i<=N;i++)
dpmax[i][0]=height[i];
for(j=1;(1<<j)<=N;j++)//注意这个地方i,j循环的嵌套关系
for(i=1;(i+(1<<j)-1)<=N;i++)
dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
}
void initmin()
{
int i,j;
for(i=1;i<=N;i++)
dpmin[i][0]=height[i];
for(j=1;(1<<j)<=N;j++)//注意这个地方i,j循环的嵌套关系
for(i=1;(i+(1<<j)-1)<=N;i++)
dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
}
int main()
{
scanf("%d%d",&N,&Q);
int i,j;
for(i=1;i<=N;i++)
scanf("%d",&height[i]);
initmax();
initmin();
while(Q--)
{
int l,r;
scanf("%d%d",&l,&r);
double in=r-l+1;
double two=2;
int k=log(in)/log(two);
int mmin=min(dpmin[l][k],dpmin[r-(1<<k)+1][k]);
int mmax=max(dpmax[l][k],dpmax[r-(1<<k)+1][k]);
printf("%d\n",mmax-mmin);
}
return 0;
}