P2880 [USACO07JAN]Balanced Lineup G(RMQ)

思路

经典时尚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;
}