思路
经典时尚RMQ最值。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
code
// Problem: P2880 [USACO07JAN]Balanced Lineup G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2880
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-04-06 20:09:33
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=5e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
int f[N][20][2];
int n,q;
void fun(){
int mx=log2(n)+1;
for(int k=1,l=1;k<=mx;k++,l<<=1)
for(int i=1;i+(l*2)-1<=n;i++){
f[i][k][0]=min(f[i][k-1][0],f[i+l][k-1][0]);
f[i][k][1]=max(f[i][k-1][1],f[i+l][k-1][1]);
//右边是i+l不是i+l-1.
}
}
int rmq(int l,int r){
int x=0,len=r-l+1;
while((1<<x)*2<len) x++;
int mn=min(f[l][x][0],f[r-(1<<x)+1][x][0]);
int mx=max(f[l][x][1],f[r-(1<<x)+1][x][1]);
return mx-mn;
}
void solve(){
//think twice code once
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&f[i][0][0]);
f[i][0][1]=f[i][0][0];
}
fun();
while(q--){
int l,r;scanf("%d%d",&l,&r);
printf("%d\n",rmq(l,r));
}
}
int main(){
solve();
return 0;
}