#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi 3.1415
typedef long long ll;
using namespace std;
int n,m,a[50005];
int fMin[50001][20];
int fMax[50005][20];
void init(){
for(int i=1; i<=n; i++)
fMin[i][0]=fMax[i][0]=a[i];
for(int j=1; (1<<j)<=n; j++){
for(int i=1; i+(1<<j)-1<=n; i++){
fMin[i][j]=min(fMin[i][j-1],fMin[i+(1<<(j-1))][j-1]);
fMax[i][j]=max(fMax[i][j-1],fMax[i+(1<<(j-1))][j-1]);
}
}
}
int query(int l,int r){
int k=(int)(log(r-l+1)/log(2));
return max(fMax[l][k],fMax[r-(1<<k)+1][k])-min(fMin[l][k],fMin[r-(1<<k)+1][k]);
}
int main(){
int x,y;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
init();
for(int i=1; i<=m; i++){
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
return 0;
}
倍增RMG例题
In数组长度5,询问数1
5 1
11 100 3 6 9
1 5
Out问[1,5]区间内最大差值
97