#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std ;
const int N = 50000 + 11 ;
int fmin[N][30] , fmax[N][30] ;
int n , m ;
void init() {
for(int i = 1 ; i<= n ; ++i) {
scanf("%d" ,&fmax[i][0]) ;
fmin[i][0] = fmax[i][0] ;
}
for(int i = 1 ; (1<<i) <= n ; ++i) {//第一个数会用到可能等于n的长度
for(int j = 1 ; j+(1<<i)-1 <= n ; ++j) {//如果下标从0开始,这里是小于
fmax[j][i] = max(fmax[j][i-1] , fmax[j+(1<<(i-1))][i-1]) ;
fmin[j][i] = min(fmin[j][i-1] , fmin[j+(1<<(i-1))][i-1]) ;
}
}
}
void query(int l , int r) {
int k = 0 ;
while((1<<(k+1)) <= r-l+1) ++k ;
int a = max(fmax[l][k] , fmax[r-(1<<k)+1][k]) ;//这里是r减去前面的长度,分成两个可能有重叠的区间
int b = min(fmin[l][k] , fmin[r-(1<<k)+1][k]) ;
printf("%d\n" , a-b) ;
}
int main() {
while(scanf("%d%d" ,&n ,&m)==2) {
init() ;
int a , b ;
while(m--) {
scanf("%d%d" ,&a ,&b) ;
query(a , b) ;
}
}
}
POJ 3264 RMQ模板
最新推荐文章于 2022-04-29 15:14:22 发布